如何在UTF-8中使用"不区分大小写"和"不区分重音"的MySQL

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中的大小写做什么组合,它都不返回任何行.

所以结论:

  • 如果游戏中没有拉丁字符,则不区分大小写.
  • 如果出现拉丁字符则区分大小写.
  • 口音敏感,好像我搜索JOSE或jose,我只得到83行,而不是我需要的84行.

我想要的是?

  • 要搜索"jose","JOSE","José","JOSÉ","JÒSE","jöse","JoSÈ",......必须返回我知道存在的84行.我该怎么把我的搜索变为不区分大小写和"拉丁"不敏感.

类似的解决方案COLLATIONLIKE不为我工作的,不知道为什么?

我能做什么?

提前致谢!

编辑:

如果我喜欢这样的话:

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-collat​​ion-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的索引.)


Blu*_*unT 8

万一其他人偶然发现了这个问题,我找到了解决问题的方法,至少对我而言.

我使用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对象.如果您有一个包装数据库功能的数据库管理类,这很容易应用于完整的应用程序.如果没有,则必须在打开连接的任何位置明确设置此项.

我希望这可以帮助别人,因为我已经对此感到害怕!