Oracle之ORA-29275-部分多字节字符
2023年12月2日大约 2 分钟
背景: 在Oracle数据库中,通过查询 A表所有数据,发现某个字段出现字符问题
SELECT * FROM A
一、遇到的问题
ORA-29275: 部分多字节字符
排查过程:
1.先定位到哪条数据有问题,这可以通过二分查找方式缩小查询范围
SELECT * FROM A WHERE rownum < 12;
2.拿出A所有的字段,进行查询,同样通过二分查找的方式缩小查询范围
select q,w,e,r... from A
3.最终定位到 A表中的 w字段有问题
select w from A
显示如下错误:ORA-29275: 部分多字节字符
原因分析:
可能某个字段中有半个中文字符则会报这个异常,原因为Oracle编码问题。
二、解决方法:
方法1: 在有问题的字段上面加上 to_nchar(字段)
select TO_NCHAR(w) from A
-- 或者
select TO_SINGLE_BYTE(w) from A
方法2:
改数据库字符集
检查他们Oracle的nls_lang环境变量,发现他们客户端的nls_lang设置为 american.
改成export NLS_LANG=AMERICAN_AMERICA.ZHS16CGB231280后, 就正常了。
方法3:
在oracle中字段中找出汉字的方法:可以利用length(testname)和lengthb(testname),其中length(testname)不论数字或者字符都算一个,
而lengthb则不同,比如说testname的值为:54看法12,用length(testname)的值为6,而lengthb(testname)的值为:8。
利用这个就可以非常清楚的判断一个字符中是否包含汉字了(字母除外)。 to_single_byte(c)转换成半角
to_multi_byte(c)转换成全角