MySQL变音符号不敏感搜索(西班牙语口音)

时间:2010-07-21 22:42:35

标签: php mysql character-encoding

我有一个MySQL数据库,其中的单词包含西班牙语(áéíóú)的重音符号。我想知道是否有任何方法可以进行变音符号的不敏感搜索。例如,如果我搜索“lapiz”(没有重音),我想从我的数据库中获得包含单词“lápiz”的结果。我目前正在进行查询的方式如下:

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

这是针对网上商店的,所以我不知道人们会搜索什么......“lapiz”只是一个例子。

alt text http://www.freeimagehosting.net/uploads/0e7c2ae7d5.png

谢谢!

5 个答案:

答案 0 :(得分:22)

字符集&整理,而不是我的最爱,但他们的工作:

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 | 
+---------------------------------+

在手册中阅读的一个很好的章节:Character Set Support

答案 1 :(得分:6)

如果将表的字符集设置为UTF-8并将字符串设置为utf8 _ * _ ci(_ci表示“不区分大小写”)MySQL将默认执行大小写和重音不敏感搜索

在此处阅读有关字符集和校对的更多信息:
http://dev.mysql.com/doc/refman/5.1/en/charset-charsets.html

我测试了它并且

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

您可以在创建时设置表的排序规则:

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

或者如果它已经存在,您可以ALTER。有关详细信息,请阅读手册(上面的链接)。
如果您使用的是phpMyAdmin,则可以在创建表时选择排序规则。

答案 2 :(得分:4)

您可以强制列名称转换为UTF8。我没有尝试过西班牙语,而是罗马尼亚字符的重音,但我认为它是一样的。

我使用的查询是:

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

或者更有可能在表格中查找列,您可以使用:

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

答案 3 :(得分:2)

存储已剥离变音符号的字符串的第二个版本?

答案 4 :(得分:2)

万一其他人偶然发现了这个问题,我找到了一种解决问题的方法,至少对我而言,不会弄乱MySQL查询中的字符集和排序规则。

我正在使用PHP从数据库中插入和检索记录。即使我的数据库,表和列是utf8,以及PHP文件的编码,事实是PHP和MySQL之间的连接中使用的编码是使用latin1进行的。我设法找到了这个 $ mysqli-> CHARACTER_SET_NAME(); 其中$ mysqli是你的对象。

为了使搜索按预期开始工作,为带有重音符号的字符返回重音不敏感和大小写的句子记录,我必须明确设置连接的字符集。

要执行此操作,您只需执行以下操作: $ mysqli-> set_charset( 'UTF8'); $ mysqli是你的mysqli对象。如果您有一个包装数据库功能的数据库管理类,这很容易应用于完整的应用程序。如果没有,您必须在打开连接的任何地方明确设置它。

我希望这可以帮助别人,因为我已经对此感到害怕!