生活的内容不全是工作,工作只是生活的一部分;享受生活,热爱工作!
分类: Sybase
2014-09-17 08:59:16
最近有用户反应,一条正常的SQL查询出来的结果不对。如下:
select ID_INTL_IP,NAM_IP from tmp_jgkh_all where NAM_IP like '%分行%' and ID_INTL_IP = '66345'
ID_INTL_IP NAM_IP
66345 汽车用品中心
从查询结果来看确实存在问题,之后得知IQ数据库采用的是ISO_BINENG 字符集。
执行查询时,搜索条件是按字节编码进行的,从上述情况来看,"分行"和"汽车用品中心"的16进制可能有相同的编码。
后来经过确认:分行 B7 D6 D0 D0 品中心 C6 B7 D6 DO D0 C4
也就是说"品"的后半个字节编码和前"中"的前半个字节编码组成了"分","中"的后半个字节编码和"心"的前半个字节编码组成了"行"。
因此在使用like 时,如果用到了全匹配"%%",就会出现上述情况,使用半匹配则不会出现上述情况。
经过测试,如果IQ数据库采用CP936字符集,则不会出现该问题;建议使用CP936字符集,避免出现上述类似问题。
注: 测试utf8字符集和iso_bineng结果一样,不建议使用。