暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

设置sql_mode解决了人大金仓数据库KingbaseES字符串过长不能自动截断的问题

原创 数据猿 2024-03-07
1450


设置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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论