Lig*_*ker 20 mysql utf-8 case-insensitive non-ascii-characters
我有"utf8 - UTF-8 Unicode"中的模式作为charset和"utf8_spanish_ci"的排序规则.
所有内部表都是InnoDB,具有与上述相同的字符集和校对.
问题出现了:
像查询一样
SELECT *
FROM people p
WHERE p.NAME LIKE '%jose%';
Run Code Online (Sandbox Code Playgroud)
我得到83个结果行.我应该有84个结果,因为我知道.
改变地点:
WHERE p.NAME LIKE '%JOSE%';
Run Code Online (Sandbox Code Playgroud)
我得到完全相同的83行.使用JoSe,Jose,JOSe等组合.报告所有相同的83行.
问题来自游戏中的重音.如果:
WHERE p.NAME LIKE '%josé%';
Run Code Online (Sandbox Code Playgroud)
我没有结果.0行.
但如果我这样做:
WHERE p.NAME LIKE '%JOSÉ%';
Run Code Online (Sandbox Code Playgroud)
我得到一个结果行,所以1行.这是唯一一个带有"jose"和大写字母的行.
我已经尝试过josÉ,或JoSÉ或我做的任何组合,只要重音符号保持大写或不大写,因为它确实存储在数据库中并且它仍然返回唯一的行.如果我突然改变"é"为"é",无论我用JOSE中的大小写做什么组合,它都不返回任何行.
所以结论:
我想要的是?
类似的解决方案COLLATION在LIKE不为我工作的,不知道为什么?
我能做什么?
提前致谢!
编辑:
如果我喜欢这样的话:
WHERE p.NAME LIKE '%jose%' COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)
我收到错误:
COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'
我也改变了列上所有可能的排序规则!
如果我做了类似的事情:
WHERE p.NAME LIKE _utf8 '%jose%' COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)
报告了相同的83行,好像我什么都没做......
O. *_*nes 11
您已尝试对搜索和排序使用不区分重音的排序规则.
http://dev.mysql.com/doc/refman/5.0/en/charset-collation-implementations.html
问题是,您的NAME列似乎存储在latin1(8位)字符集中.这就是为什么mySQL像这样抱怨你:
COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'
Run Code Online (Sandbox Code Playgroud)
如果您尝试,您可能会得到您想要的结果
WHERE CONVERT(p.NAME USING utf8) LIKE _utf8 '%jose%' COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)
不过要小心!
当您在WHERE语句中的列上使用任何类型的函数(在此示例中为CONVERT)时,您将无法使用索引优化MySQL的搜索尝试.如果这个项目变得很大(也就是说,如果表中有很多行),你需要以utf8格式存储数据,而不是latin1.(您可能已经知道您的LIKE '%whatever%'搜索词也会破坏MySQL的索引.)
万一其他人偶然发现了这个问题,我找到了解决问题的方法,至少对我而言.
我使用PHP来插入和检索数据库中的记录.即使我的数据库,表和列是utf8,以及PHP文件的编码,事实是PHP和MySQL之间的连接中使用的编码是使用latin1进行的.我设法找到了这个
$mysqli->character_set_name();
Run Code Online (Sandbox Code Playgroud)
$mysqli你的对象在哪里
为了使搜索开始按预期工作,为带有重音符号的字符返回重音不敏感和大小写的句子记录,我必须显式设置连接的字符集.
为此,您只需执行以下操作:
$mysqli->set_charset('utf8');
Run Code Online (Sandbox Code Playgroud)
$ mysqli是你的mysqli对象.如果您有一个包装数据库功能的数据库管理类,这很容易应用于完整的应用程序.如果没有,则必须在打开连接的任何位置明确设置此项.
我希望这可以帮助别人,因为我已经对此感到害怕!
| 归档时间: |
|
| 查看次数: |
23898 次 |
| 最近记录: |