21

我在“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 行。使用 JoSe、Jose、JOSe 等组合。报告所有相同的 83 行。

当重音在游戏中播放时,问题就来了。如果这样做:

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

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

但如果我这样做:

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

我只得到一个结果行,所以 1 行。这是唯一带有重音“jose”并大写的行。

我已经尝试过使用 josÉ 或 JoSÉ 或我所做的任何组合,只要重音字母保持大写或不保持大写,因为它确实存储在数据库中并且它仍然返回唯一的行。如果我突然用 JOSE 中的大写字母组合将“É”更改为“é”,它不会返回任何行。

所以结论:

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

我想要的是?

  • 要搜索“jose”、“JOSE”、“José”、“JOSÉ”、“JÒSE”、“jöse”、“JoSÈ”……必须返回我知道存在的 84 行。我如何将我的搜索变成不区分大小写和不区分“拉丁”的。

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

我能做些什么?

编辑:

如果我这样做:

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

我得到错误:

COLLATION 'utf8_general_ci' 对 CHARACTER SET 'latin1' 无效

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

如果我做类似的事情:

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

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

4

2 回答 2

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'

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

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

但小心点!

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

于 2012-05-31T11:44:27.887 回答
8

以防万一其他人偶然发现这个问题,我已经找到了解决问题的方法,至少对我来说是这样。

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

$mysqli->character_set_name();

$mysqli你的对象在哪里。

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

为此,您只需执行以下操作:

$mysqli->set_charset('utf8');

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

我希望这对某人有所帮助,因为我已经对此感到害怕了!

于 2013-07-19T15:39:27.120 回答