如何用MySQL“不区分大小写”和“不区分重音”在UTF-8(How to MySQL work “

2019-06-25 00:03发布

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

里面所有的表都具有相同的字符集和校对规则的InnoDB提到。

这里谈到的问题:

与像查询

SELECT *
FROM people p
WHERE p.NAME LIKE '%jose%';

我得到83个结果行。 我应该有84分的结果,因为我知道这一点。

更改其中用于:

WHERE p.NAME LIKE '%JOSE%';

我得到完全相同的83行。 有了这样何塞,何塞,何塞等组合报告的所有相同的83行。

问题是当口音玩游戏。 如果这样做:

WHERE p.NAME LIKE '%josé%';

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

但是,如果我这样做:

WHERE p.NAME LIKE '%JOSÉ%';

我得到的只是一个结果行,所以1行。 这是重音“何塞”和资本的唯一排至极脑水肿。

我试着与何塞,何塞或或任何组合我做什么,只要信重音大写撑与否,因为它确实是存储在数据库中,并返回剧照只有一行。 如果我突然改变我在JOSE资本做任何组合“E”代表“é”,它不返回行。

所以,结论:

  • 情况下,如果没有拉丁字符在游戏中扮演不敏感。
  • 情况下,如果出现拉丁字符敏感。
  • 区分重音,好像我搜索JOSE或何塞,我只得到83行,而不是84行,我需要。

我想要的是?

  • 要搜索“何塞”,“何塞”,“何”,“何塞”,“何塞”,“何塞”,“何塞”,...不得不返回84行,我知道存在。 我怎么把我的searchs为不区分大小写和“拉丁”不敏感。

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

我能做什么?

提前致谢!

编辑:

如果我做sometingh这样的:

WHERE p.NAME LIKE '%jose%' COLLATE utf8_general_ci;

我得到的错误:

COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'

我已经改变了列所有可能的排序规则呢!

如果我这样做:

WHERE p.NAME LIKE _utf8 '%jose%' COLLATE utf8_general_ci;

同样的83行被报道,就好像我做了什么?

Answer 1:

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

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'

你可以得到你想要的,如果你尝试的结果

 WHERE CONVERT(p.NAME USING utf8) LIKE _utf8 '%jose%' COLLATE utf8_general_ci;

不过要小心!

当您使用任何一种功能(在这个例子中,CONVERT)在列的WHERE语句,你击败MySQL的尝试优化使用索引搜索。 如果这个项目是会得到大的(也就是说,如果你将有很多行的你的表),你需要存储在UTF8格式的数据,不是latin1。 (您可能已经知道你LIKE '%whatever%'的搜索词也违背了MySQL的索引。)



Answer 2:

就在在这个问题上的情况下别人跌倒,我发现,解决问题,至少对我的一种方式。

我使用PHP插入和检索数据库中的记录。 虽然我的数据库,表和列是UTF8,以及PHP文件的编码,事实是,在PHP和MySQL之间的连接使用的编码被使用LATIN1制造。 我设法找到了这个用

$mysqli->character_set_name();

其中$mysqli是你的对象。

对于搜索开始工作正常,返回不区分重音和案例insentive记录与重音符号的字符或没有,我要明确设置字符集的连接。

要做到这一点,你就必须做到以下几点:

$mysqli->set_charset('utf8');

其中$ mysqli的是你的mysqli对象。 如果你有一个封装数据库功能的数据库管理类,这是很容易申请到一个完整的应用程序。 如果没有,你有你打开一个连接设置此明确地随处可见。

我希望这可以帮助别人了,因为我已经吓坏了这个!



文章来源: How to MySQL work “case insensitive” and “accent insensitive” in UTF-8