我有一个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
谢谢!
答案 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对象。如果您有一个包装数据库功能的数据库管理类,这很容易应用于完整的应用程序。如果没有,您必须在打开连接的任何地方明确设置它。
我希望这可以帮助别人,因为我已经对此感到害怕!