【问题标题】:MySQL diacritic insensitive search (spanish accents)MySQL 变音符号不敏感搜索(西班牙口音)
【发布时间】:2010-07-21 22:42:35
【问题描述】:

我有一个 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

谢谢!

【问题讨论】:

  • 你忘记了ü(如pingüino)。

标签: php mysql character-encoding


【解决方案1】:

字符集和排序规则,不是我最喜欢的,但它们确实有效:

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

【讨论】:

    【解决方案2】:

    如果您将表的字符集设置为 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,则可以在创建表时选择排序规则。

    【讨论】:

    • 如何设置餐桌?我对 mySQL 不是很熟悉。谢谢!
    • 我已将表 (CubeCart_inventory) 修改为 uft_general8_ci,但仍然无法正常工作。我用 phpmyadmin 修改了我的表(请参阅原始帖子中的图像)。我的网页是 www.carrodelectronica.com
    【解决方案3】:

    您可以强制将列名转换为 UTF8。我没有尝试过用于西班牙语,而是用于带有口音的罗马尼亚字符,但我认为这是同一件事。

    我使用的查询是:

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

    或者在更有可能在表中查找列的情况下,您可以使用:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我不知道我是否解释了自己。假设 $q 等于“lapiz”。我需要从包含“lápiz”的数据库中取回结果。我认为当 $q 等于 "lápiz" 时你在说话,然后你去掉变音符号,这是相反的。谢谢!
      • @Hector Amber 的意思是在 MySQL 中存储不带重音符号的字符串副本。然后,您始终可以对该列执行搜索。不过这不是必需的,请尽快回答。
      • 我听说有一种方法可以将 mySQL 设置为 UTF8,这样您就可以进行变音符号不敏感比较。你知道吗?
      【解决方案5】:

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

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

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

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

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

      【讨论】:

      • 你救了我的命,这让我困惑了很久!谢谢,这是我需要的答案。
      猜你喜欢
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多