[20130610]褆与竖线分隔符.txt
前几天生产系统系统遇到的一个问题,就是上传数据到医保中心时,总有一条记录总是报传入参数数量不对.传入的内容按照|来分割.我仔细检查发现传入的参数数量正确,数据类型也正确,为什么还是报这个错误.仔细检查才发现问题在这条记录内容上.
我在linux下做一个例子来说明:
$ cat aa.txt
123|张飞褆test|aaa1
$ cut -f1 -d'|' aa.txt
123
$ cut -f2 -d'|' aa.txt
张飞?
$ cut -f3 -d'|' aa.txt
test
$ cut -f4 -d'|' aa.txt
aaa1
--我们数据库使用的字符集:NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK.可以发现正常执行cut -f2 -d'|' aa.txt
--按照正常显示应该是'张飞褆test'.而实际是'张飞?'.
$ cat a1.txt
褆
$ xxd -c 16 a1.txt
0000000: d17c 0a 褆.
SQL> @16to10 7c
16 to 10 DEC
------------
124
SQL> select chr(124) from dual ;
C
-
|
--可以发现7c(16进制)就是|,这样导致系统认为参数的数量不正确.
--按照道理应该还存在许多字符会出现这种情况:(大部分不常使用)
--我管理的数据库有一些还使用AMERICAN_AMERICA.US7ASCII,注意以上问题与字符集无关.
--我执行如下: [说明如果是中文字符集,执行如下语句结果与输出不同]
--数据库字符集AMERICAN_AMERICA.US7ASCII.
select upper(TO_CHAR (167+rownum,'xxxxxxxxxxxxx')) "10to16",chr(167+rownum)||'|' from dual connect by level+160<=254;
10to16 HZ
---------
A8 ▅
A9 ﹟
AA 獆
AB 珅
AC 瑋
AD 瓅
AE 畖
AF 瘄
B0 皘
B1 眧
B2 瞸
B3 硘
B4 磡
B5 祙
B6 秥
B7 穦
B8 竱
B9 箌
BA 簗
BB 粅
BC 紎
BD 絴
BE 緗
BF 縷
C0 纜
C1 羭
C2 聕
C3 脇
C4 膢
C5 舼
C6 苵
C7 莬
C8 葇
C9 蓔
CA 蕓
CB 藎
CC 蘾
CD 蛗
CE 蝲
CF 蟶
D0 衸
D1 褆
D2 襹
D3 觸
D4 詜
D5 諀
D6 謡
D7 讄
D8 貄
D9 質
DA 趞
DB 踻
DC 軀
DD 輡
DE 迀
DF 遼
E0 鄚
E1 醸
E2 鈢
E3 銃
E4 鋦
E5 鍇
E6 鎩
E7 鐋
E8 鑭
E9 閨
EA 陓
EB 雦
EC 靯
ED 韡
EE 顋
EF 飢
F0 饇
F1 駖
F2 騶
F3 髚
F4 魘
F5 鮸
F6 鰘
F7 鱸
F8 鴟
F9 鵿
FA 鷟
FB 鹼
FC 鼃
FD 齶
FE
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-763696/
,如需转载,请注明出处,否则将追究法律责任。