当前位置: 首页>数据库>正文

db2 sql 命令中文乱码 db2数据库中文乱码

针对汉字乱码

末尾乱码:末尾第二个字节的ASCII的值大于224 或 末尾第一个字节的ASCII的值大于224 去掉办法:

case when length(colname)>1 and ascii(substr(colname,length(colname),1))>224 then 去掉最后一位
when length(colname)>2 and ascii(substr(colname,length(colname)-1,1))>224 then 去掉最后两位
colname end

开始乱码:第一个字节的ASCII的值大于128且小于224 , 且 第二个字节的ASCII值大于128 为前两位乱码 否则首位乱码 去掉办法:

case when length(colname)>2 and ascii(substr(colname,1))>128 and and ascii(substr(colname,1))< 224 and and ascii(substr(colname,2,1)>128 then 去掉前两位 when length(colname)>1 and ascii(substr(colname,1))>128 and and ascii(substr(colname,1))< 224 then 去掉第一位 colname end

详见:

用 substr截取函数会产生乱码,用right或left会把乱码替换为空格

values (ascii(substr('硬拷贝',1,1)),ascii(substr('拷贝',1,1)),ascii(substr('贝',1,1)),ascii(left('硬拷贝',1))),
(ascii(substr('硬拷贝',2,1)),ascii(substr('拷贝',2,1)),ascii(substr('贝',2,1)),ascii(left('硬拷贝',1))),
(ascii(substr('硬拷贝',3,1)),ascii(substr('拷贝',3,1)),ascii(substr('贝',3,1)),ascii(left('硬拷贝',1)))

对于乱码无较好的办法,只能进行挨个字符判断

1)?对只有在末尾和开始才有的处理

末尾第二个字节的ASCII的值大于224 且 第一个字节的ASCII值大于128 为乱码 或 末尾第一个字节的ASCII的值大于224?待确定

开始第一个字节的ASCII的值大于128 或 第二个字节的ASCII值大于128 为乱码?待确定

2)?对在末尾和开始、中间都有的处理

UTF-8 字符的最大长度可以为 4 个字节。非补充字符的最大长度为 3 个字节,而补充字符的长度为 4 个字节。

使用 UTF-8 格式的每个 UTF-16 字符的字节数可根据表 1 来确定。

在以上每一项中,u、w、x、y 和 z 串都是字符的位表示法。例如,U+0080 变换为二进制中的 11000010 10000000,而代用字符对 U+D800 U+DC00 变为 二进制中的 11110000 10010000 10000000 10000000。

values 128+64+32
values 128+64+32 =224
values 14*16 =224
VALUES (X'C3B1C3B2C3B3')
VALUES chr(65),chr(224)
VALUES GRAPHIC('硬拷贝'),substr(GRAPHIC('硬拷贝'),1,1)
VALUES VARGRAPHIC('硬拷贝'),substr(VARGRAPHIC('硬拷贝'),1,1)
values VARGRAPHIC(substr('贝',1,1))--出错

UTF编码

UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:

UCS-2编码(16进制) UTF-8 字节流(二进制)

0000 - 007F 0xxxxxxx

0080 - 07FF 110xxxxx 10xxxxxx

0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

读者可以用记事本测试一下我们的编码是否正确。需要注意,UltraEdit在打开utf-8编码的文本文件时会自动转换为UTF-16,可能产生混淆。你可以在设置中关掉这个选项。更好的工具是Hex Workshop。

UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。


https://www.xamrdz.com/database/6p61934728.html

相关文章: