人大金仓 金仓数据库KingbaseES 字符串截断特性
金仓数据库KingbaseES 字符串截断特性
关键字:
KingbaseES、mysql、char
1.Kes在不同编码下的字符串
oracle 模式中,假使nls_length_semantics 缺省是 byte :
将GBK作为服务器的编码,客户端的编码设置为UTF8,可以将 insert into test values (‘一二’);成功执行 将UTF8作为服务器的编码,客户端的编码设置为UTF8,可以将 insert into test values (‘一二’);不能成功执行,原因在于utf8在编码时比GBK多了字节,不能正常插入报错。
在mysql 模式中表现和oracle相同,同样,为了证实这一点,穿件binary类型,并对字符串长度进行计算。
GBK编码
字符 |binary |字节长度| 字符长度
一 | 0xd2bb | 2 | 1
一二 | 0xd2bbb6fe | 4 | 2
1一 | 0x31d2bb | 3 | 2
UTF8编码
字符 |binary |字节长度| 字符长度
一 | 0xe4b880 | 3 | 1
一二 | 0xe4b880e4ba8c | 6 | 2
1一 | 0x31e4b880 | 4 | 2
2.Mysql模式中的字符串截断
Kes在mysql模式下默认开启非严格模式,会对超长的字符串进行截断保存,期间只会警告而不会报错终端执行。show sql_mode显示的值中不包含STRICT_ALL_TABLES。要更改默认行为,需要set sql_mode=STRICT_ALL_TABLES,ONLY_FULL_GROUP_BY。
同样,对不同编码的字符进行截断。假设,create table test (col BINARY(1));然后插入相同的数据,就可以得到下表。
UTF8编码
字符 |binary |字节长度| 字符长度
一 | 0xe4 | 1 | 1
一二 | 0xe4 | 1 | 1
1一 | 0x31 | 1 | 1
实际上0xe4并不能显示出来了,0x31在可以转换显示成1。
同样,对不同编码的字符进行截断。假设,create table test (col char(1));然后插入相同的数据,就可以得到下表。
UTF8编码
字符 |char |length| 字符长度
一二 | 一 | 1 | 1
1一 | 1 | 1 | 1
注,kes的 mysql模式返回的是字符长度。在对字符串进行统计时,mysql
和kes 表现有差异。Mysql数据库返回的是字节数。如下左为mysql,右为kes的mysql模式:


GBK 编码
字符 |char |length| 字符长度
一二 | 一 | 1 | 1
1一 | 1 | 1 | 1
注: GBK表现和UTF8相同,都可以正常的截断字符串。
值得注意的是,kes 的mysql 模式同mysql 表现一致,支持的是字符的截断,也就是create table test (col char(1)),在kes mysql模式中,虽然可以显式的指定类型create table test (col char(1 char)), create table test (col char(1 byte)),但是不推荐使用,其中指定为byte类型时,不能进行截断。如果有需要根据字节进行截断的情况,可以使用binary。
更多信息,参见https://help.kingbase.com.cn/v8/index.html
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
