为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: DM8 20221027
【操作系统】: linux
【CPU】: 4
【问题描述】*: 我定义的varchar(8000),期望它能存入8000个中文字符, 实际上并不能到8000,这是改哪个配置的?
下面是我的数据库初始化相关配置
./dminit path=/opt/dm8/data DB_NAME=TEST CASE_SENSITIVE=0 LENGTH_IN_CHAR=0 INSTANCE_NAME=TEST PAGE_SIZE=32 CHARSET=1 LOG_PATH=/opt/dm8/log/TEST01.log LOG_PATH=/opt/dm8/log/TEST02.log
这是我的初始化命令。
执行之后我还修改了dm.ini上的配置:
COMPATIBLE_MODE 将它的值由0改为4
MY_STRICT_TABLES 将它的值由0改为1
drop table if exists tmp_varchar;
create table tmp_varchar(
id int,
test_varchar varchar(8000),
test_varchar8 varchar(8)
);
– 这里是可以执行插入10个字符的。
insert into tmp_varchar(id, test_varchar8) values(10, ‘八字长度八字长度八字’);
– 下面的这个只能到5400不到的字符
insert into tmp_varchar(id, test_varchar) values(8000, ‘这里填了8000字符,’);
varchar默认是计算的字节长度,受字符集影响,再utf-8字符集时,1个汉字算3个字节,可以用lengthb计算;在gb18030字符集时,一个汉字是2个字节。
COMPATIBLE_MODE = 4时是为了兼容MySQL的字符存储,不推荐使用。
如果你需要存最大8000个汉字,那么在gb18030的字符集下要varchar(16000),且页大小也要放大(32k),开启超长记录模式后,每个列的最大长度不能超过页大小的一半。