MySQL变音不敏感search(西class牙口音)

我有一个包含西class牙语重音的单词(áéíóú)的MySQL数据库。 我想知道是否有任何方法来做一个变音不敏感的search。 例如,如果我search“lapiz”(没有口音),我想从我的数据库中获得包含单词“lápiz”的结果。 我目前正在查询的方式如下所示:

$result = mysql_query("SELECT * FROM $lookuptable WHERE disabled = '0' AND name LIKE '%$q%' OR productCode LIKE '%$q%' LIMIT $sugglimit"); 

这是一个网上商店,所以我不知道人们会寻找什么…“lapiz”只是例子。

替代文字http://www.freeimagehosting.net/uploads/0e7c2ae7d5.png

谢谢!

字符集和sorting规则,不是我的最爱,但他们的工作:

 mysql> SET NAMES latin1; mysql> SELECT 'lápiz' LIKE 'lapiz'; +-----------------------+ | 'lápiz' LIKE 'lapiz' | +-----------------------+ | 0 | +-----------------------+ 1 row in set (0.01 sec) mysql> SET NAMES utf8; mysql> SELECT 'lápiz' LIKE 'lapiz'; +-----------------------+ | 'lápiz' LIKE 'lapiz' | +-----------------------+ | 1 | +-----------------------+ mysql> SET NAMES latin1; mysql> SELECT _utf8'lápiz' LIKE _utf8'lapiz' ; +---------------------------------+ | _utf8'lápiz' LIKE _utf8'lapiz' | +---------------------------------+ | 1 | +---------------------------------+ 

在手册中阅读一个很好的章节: 字符集支持

如果您将表格的字符集设置为UTF-8,并将sorting规则设置为utf8 _ * _ ci(_ci表示“不区分大小写”),则MySQL将默认执行区分大小写且不区分重音的search

阅读更多关于字符集和sorting规则:
http://dev.mysql.com/doc/refman/5.1/en/charset-charsets.html

我testing了它

 "lapiz" matches: "lápiz," "lapíz," and "lapiz" "nino" matches: "niño," "ninó," and "nino" 

您可以在创build时设置表格的sorting规则:

 CREATE TABLE table ( ... ) CHARACTER SET uft8 COLLATE utf8_general_ci; 

或者你可以改变它,如果它已经存在。欲了解更多信息,请阅读手册(上面的链接)。
如果您正在使用phpMyAdmin,则可以在创build表格时selectsorting规则。

您可以强制列名转换为UTF8。 我没有尝试过的是西class牙语,而是罗马尼亚的口音,但我认为这是一回事。

我使用的查询是:

 SELECT CONVERT('gîgă' USING utf8) LIKE '%giga%' 

或者更可能的情况是在表格中查找一列,可以使用:

 SELECT CONVERT(column_name USING utf8) FROM table_name LIKE '%giga%' 

存储已删除了变音符号的string的第二个版本?

为了防止别人绊倒这个问题,我find了解决这个问题的方法,至less对我来说,没有搞乱MySQL查询中的字符集和整理。

我正在使用PHP从数据库插入和检索logging。 即使我的数据库,表和列是utf8,以及PHP文件的编码,事实上PHP和MySQL之间的连接使用的编码是使用latin1。 我设法使用$ mysqli-> character_set_name(); $ mysqli是你的对象。

为了使search开始按预期工作,对带有重音或不重音的字符返回不区分重音和不重复的logging,我必须显式设置连接的字符集。

要做到这一点,你只需要做到以下几点:$ mysqli-> set_charset('utf8'); 其中$ mysqli是你的mysqli对象。 如果你有一个包装你的数据库function的数据库pipe理类,这很容易应用到一个完整的应用程序。 如果没有,你必须在你打开连接的每一个地方明确地设置它。

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