首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在UTF8中“不区分大小写”和“不区分重音”工作MySQL

如何在UTF8中“不区分大小写”和“不区分重音”工作MySQL
EN

Stack Overflow用户
提问于 2012-05-31 17:40:28
回答 2查看 26.4K关注 0票数 21

我有一个"utf8 -- UTF-8Unicode“作为字符集的模式和一个"utf8_spanish_ci”排序规则。

里面的所有表都是InnoDB,具有与前面提到的相同的字符集和排序规则。

问题来了:

使用类似这样的查询

代码语言:javascript
复制
SELECT *
FROM people p
WHERE p.NAME LIKE '%jose%';

我得到了83个结果行。我应该有84个结果,因为我知道。

更改的位置:

代码语言:javascript
复制
WHERE p.NAME LIKE '%JOSE%';

我得到了完全相同的83行。使用JoSe、Jose、JOSe等组合。报告了所有相同的83行。

当口音在游戏中发挥作用时,问题就来了。如果这样做:

代码语言:javascript
复制
WHERE p.NAME LIKE '%josé%';

我没有得到任何结果。0行。

但如果我这么做了:

代码语言:javascript
复制
WHERE p.NAME LIKE '%JOSÉ%';

我只得到了一个结果行,所以是1行。这是唯一一个重音为"jose“且大写的行。

我尝试过JoSé,或者JoSé,或者我所做的任何组合,只要重音字母保持大写或不大写,因为它实际上存储在数据库中,并且它仍然返回唯一的行。如果我突然将"é“改为”é“,不管我对JOSE中的大小写做什么组合,它都不会返回任何行。

所以结论是:

如果游戏中没有拉丁字符,则

  • 不区分大小写。如果拉丁字符区分大小写,则
  • 区分大小写,就像我搜索jose或JOSE一样,我只得到83行,而不是所需的84行。

我想要什么?

  • 搜索"jose","JOSE","José",“JOSE”,“J?se”,"jöse",“JoSé”,...必须返回我知道存在的84行。我知道如何将搜索结果转换为不区分大小写和“拉丁语”的insensitive.

LIKE上的COLLATION这样的解决方案对我不起作用,不知道为什么...

我能做什么?

编辑:

如果我这样做:

代码语言:javascript
复制
WHERE p.NAME LIKE '%jose%' COLLATE utf8_general_ci;

我得到了错误:

归类'utf8_general_ci‘对字符集'latin1’无效

而且我还更改了列上所有可能的排序规则!

如果我这样做:

代码语言:javascript
复制
WHERE p.NAME LIKE _utf8 '%jose%' COLLATE utf8_general_ci;

报告了同样的83行,就好像我什么都没做一样...

EN

回答 2

Stack Overflow用户

发布于 2012-05-31 19:44:28

您已尝试使用不区分重音的排序规则进行搜索和排序。

http://dev.mysql.com/doc/refman/5.0/en/charset-collation-implementations.html

问题是,您的NAME列似乎存储在latin1 (8位)字符集。这就是为什么mySQL像这样对你发牢骚:

代码语言:javascript
复制
  COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'

如果你试一试,你可能会得到你想要的结果

代码语言:javascript
复制
 WHERE CONVERT(p.NAME USING utf8) LIKE _utf8 '%jose%' COLLATE utf8_general_ci;

但是,要小心!

当您在WHERE语句中的列上使用任何类型的函数(在本例中为CONVERT)时,您会挫败MySQL使用索引优化搜索的尝试。如果这个项目要变得很大(也就是说,如果您的表中有很多行),您需要以utf8格式而不是latin1格式存储数据。(您可能已经知道,您的LIKE '%whatever%'搜索词也击败了MySQL的索引。)

票数 11
EN

Stack Overflow用户

发布于 2013-07-19 23:39:27

为了防止其他人遇到这个问题,我已经找到了一个解决问题的方法,至少对我来说是这样。

我正在使用PHP从数据库中插入和检索记录。尽管我的数据库、表和列以及PHP文件的编码都是utf8的,但事实是,在PHP和MySQL之间的连接中使用的编码是使用latin1进行的。我设法找到了这个

代码语言:javascript
复制
$mysqli->character_set_name();

其中$mysqli是您的对象。

为了让搜索按预期开始工作,返回重音不敏感和大小写不敏感的字符记录,我必须显式设置连接的字符集。

要做到这一点,您只需执行以下操作:

代码语言:javascript
复制
$mysqli->set_charset('utf8');

其中$mysqli是您的mysqli对象。如果您有一个包装了数据库功能的数据库管理类,这很容易应用于一个完整的应用程序。如果不是,则必须在打开连接的任何地方显式设置此属性。

我希望这能帮助一些人,因为我已经被它吓坏了!

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10831076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档