错误场景还原
今天在利用DEXP、DIMP工具做达梦数据库(DM8)的测试工作的时候,导入数据时,工具提示[警告]服务器与文件内数据的LENGTH_IN_CHAR参数不匹配【警告】可能会有错误发生。
这是因为源数据库、目的数据库的初始化参数LENGTH_IN_CHAR设置不一致的原因。
LENGTH_IN_CHAR参数说明
VARCHAR 类型对象的长度是否以字符为单位。取值:1、Y 表示是,0、N 表示否。默认值为 0。可选参数。
-
1 或 Y:是,所有 VARCHAR 类型对象的长度以字符为单位。这种情况下,定义长度并非真正按照字符长度调整,而是将存储长度值按照理论字符长度进行放大。所以会出现实际可插入字符数超过定义长度的情况(超过的时候往往是因为有数字或是英文字符占位较少造成的),这种情况也是允许的。同时,存储的字节长度 8188 上限仍然不变,也就是说,即使定义列长度为 8188 字符,其实际能插入的字符串占用总字节长度仍然不能超过 8188;
-
0 或 N:否,所有 VARCHAR 类型对象的长度以字节为单位。
-
数据库中设定LENGTH_IN_CHAR为1或Y时,字段长度没有超过8188时,其实际的占用的字节长度根据ASCII字符+CHARSET/UNICODE_FLAG参数定义的字符集单字符的宽度*该种字符数。
举个例子
比如字段类型同样都是VARCHAR(10),UNICODE_FLAG取值GB18030。当LENGTH_IN_CHAR取值1(以字符为单位)时,那么最多可以存放10个中文字符,空间最多占用20个字节,存放10个中文后,使用字符统计相关命令,如LENGTH(字段名)时,得到的值应该是10,而用LENGTHB(字段名)时,得到的值是20;当LENGTH_IN_CHAR取值0(以字节为单位)时,那么最多可以存放5个中文字符,空间占用了10个字节,在存放5个中文后使用字符统计相关命令,使用LENGTH命令得到的是5,LENGTHB得到的值是10。