设置sql_mode解决了金仓数据库KingbaseES字符串过长不能自动截断的问题
关键字
字符编码、mysql、sql_mode、自动截断、人大金仓、KingbaseES
问题描述
Mysql 模式:在创建包含字符串的表进行插入数据时过长,直接报错不能插入。
问题分析
缺少对字符串过长的自动处理。
解决方案
Kes在mysql模式下默认开启非严格模式,会对超长的字符串进行截断保存,期间只会警告而不会报错终端执行。show sql_mode显示的值中不包含STRICT_ALL_TABLES。要更改默认行为,需要set sql_mode=STRICT_ALL_TABLES,ONLY_FULL_GROUP_BY。(以下用例在utf8下执行)
影响因素:
1. nls_length_semantics(兼容oraclec参数)
char按字符存储; byte按字节存储。
drop table test;
set nls_length_semantics = 'char';
create table test (col char(1));
insert into test values ('一啊');
select * from test;
drop table test;
set nls_length_semantics = 'byte';
create table test (col char(1));
insert into test values ('一啊');
select * from test;2. sql_mode
默认非严格模式,可以自动截断。
set sql_mode=STRICT_ALL_TABLES,ONLY_FULL_GROUP_BY,ANSI_QUOTES;
drop table test;
create table test (col char(1));
insert into test values ('一啊');
select * from test;
set sql_mode=ONLY_FULL_GROUP_BY,ANSI_QUOTES;
drop table test;
create table test (col char(1));
insert into test values ('一啊');
select * from test;3. 编码
值得注意的是,kes 的mysql 模式同mysql 表现一致,支持的是字符长度的截断,虽然可以显式的指定类型create table test (col char(1 char)), create table test (col char(1 byte)),但是不推荐使用,其中指定为byte类型时,不能进行截断。如果有需要根据字节进行截断的情况,可以使用binary类型。
set nls_length_semantics = 'byte';
drop table test;
create table test (col char(2));
insert into test values ('一啊一啊一啊');
select * from test;参考资料
《KingbaseES SQL语言参考手册》
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




