今天回答IT邦友问题
MYSQL 搜寻字母符号问题 - iT 邦帮忙::一起帮忙解决难题,拯救 IT 人的一天
资料库是mysql,
搜寻žř这样的特殊文字会被当成zr来处理,
请问有什么解决办法呢?
比如有2笔资料分别是žybřidcz和zybridcz,
我下指令
select * from TestTable where text= 'žybřidcz' 或
select * from TestTable where text= 'zybridcz'
结果2笔都会出来.
看到后面一级屠猪士
大大使用Postgresql轻鬆解决问题
所以想去比较不同资料库之间的差异
先準备测试资料
| text ||----------|| tuấn || tuan || žybřidcz || zybridcz |
MySQL:
假如只单纯使用=
,会发现四个值都被查询出来
select * from TestTable where text = 'žybřidcz' or text = 'tuan';| text ||----------|| tuấn || tuan || žybřidcz || zybridcz |
需要使用HEX
或是INSTR
才能筛选掉
select * from TestTable where INSTR(text,'tuan') > 0 or INSTR(text,'žybřidcz') > 0;select * from TestTable where HEX('tuan') = HEX(text) or HEX('žybřidcz') = HEX(text); | text ||----------|| tuan || žybřidcz |
另外还有大小写问题,查询text = 'TUAN'
可以查到资料tuan跟tuấn
select * from TestTable where text = 'TUAN';| text ||------|| tuấn || tuan |
附上:线上测试连结
SQL Server:
假如只单纯使用=
不会有问题
select * from TestTablewhere text = 'žybřidcz' or text = 'tuan';| text ||----------|| tuan || žybřidcz |
但是,会有大小写问题
查询text = 'TUAN'
可以查到资料tuan
select * from TestTablewhere text = 'TUAN';| text ||----------|| tuan |
可以参考我之前在SO回答的问题
sql server - SQL upper/lower + substring not working well - Stack Overflow
使用COLLATE Latin1_General_CS_AS
或是ASCII
解决
附上:线上测试连结
Postgresql跟Oracle:
不需要Hex、collate直接=
比较就可以,也没有大小写问题
附上:Postgresql线上测试连结
附上:Oracle线上测试连结
select * from TestTablewhere text = 'žybřidcz' or text = 'tuan'; | text ||----------|| tuan || žybřidcz |
总结:
假如大大们知道原理,或是有其他看法都可以讨论。