我有一个"utf8 -- UTF-8Unicode“作为字符集的模式和一个"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中的大小写做什么组合,它都不会返回任何行。
所以结论是:
如果游戏中没有拉丁字符,则
我想要什么?
像LIKE
上的COLLATION
这样的解决方案对我不起作用,不知道为什么...
我能做什么?
编辑:
如果我这样做:
WHERE p.NAME LIKE '%jose%' COLLATE utf8_general_ci;
我得到了错误:
归类'utf8_general_ci‘对字符集'latin1’无效
而且我还更改了列上所有可能的排序规则!
如果我这样做:
WHERE p.NAME LIKE _utf8 '%jose%' COLLATE utf8_general_ci;
报告了同样的83行,就好像我什么都没做一样...
发布于 2012-05-31 19:44:28
您已尝试使用不区分重音的排序规则进行搜索和排序。
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'
如果你试一试,你可能会得到你想要的结果
WHERE CONVERT(p.NAME USING utf8) LIKE _utf8 '%jose%' COLLATE utf8_general_ci;
但是,要小心!
当您在WHERE语句中的列上使用任何类型的函数(在本例中为CONVERT)时,您会挫败MySQL使用索引优化搜索的尝试。如果这个项目要变得很大(也就是说,如果您的表中有很多行),您需要以utf8格式而不是latin1格式存储数据。(您可能已经知道,您的LIKE '%whatever%'
搜索词也击败了MySQL的索引。)
发布于 2013-07-19 23:39:27
为了防止其他人遇到这个问题,我已经找到了一个解决问题的方法,至少对我来说是这样。
我正在使用PHP从数据库中插入和检索记录。尽管我的数据库、表和列以及PHP文件的编码都是utf8的,但事实是,在PHP和MySQL之间的连接中使用的编码是使用latin1进行的。我设法找到了这个
$mysqli->character_set_name();
其中$mysqli
是您的对象。
为了让搜索按预期开始工作,返回重音不敏感和大小写不敏感的字符记录,我必须显式设置连接的字符集。
要做到这一点,您只需执行以下操作:
$mysqli->set_charset('utf8');
其中$mysqli是您的mysqli对象。如果您有一个包装了数据库功能的数据库管理类,这很容易应用于一个完整的应用程序。如果不是,则必须在打开连接的任何地方显式设置此属性。
我希望这能帮助一些人,因为我已经被它吓坏了!
https://stackoverflow.com/questions/10831076
复制相似问题