【问题标题】:Case insensitive unicode collation in MySQLMySQL中不区分大小写的unicode排序规则
【发布时间】:2011-05-23 17:13:50
【问题描述】:

我有一个数据库,我们在其中存储每个名称的首字母大写的用户名——例如,IsaacSparling。我正在尝试对我的 MySQL (v5.1.46) 数据库进行不区分大小写的自动完成。表有一个 UTF8 字符集和一个 utf8_unicode_ci 排序规则。我也针对 utf8_general_ci 排序规则进行了这些测试。

纯 ASCII 文本可以正常工作:

mysql> select username from users where username like 'j%';
+----------------+
| username       |
+----------------+
| J********      |
| J***********   |
| J************* |
+----------------+
3 rows in set (0.00 sec)

mysql> select username from users where username like 'J%';
+----------------+
| username       |
+----------------+
| J********      |
| J***********   |
| J************* |
+----------------+
3 rows in set (0.00 sec)

(名称已编辑,但它们在那里)。

但是,当我尝试对 ASCII 集之外的 unicode 字符执行相同操作时,没有这样的运气:

mysql> select username from users where username like 'ø%';
Empty set (0.00 sec)


mysql> select username from users where username like 'Ø%';
+-------------+
| username    |
+-------------+
| Ø*********  |
+-------------+
1 row in set (0.00 sec)

一些调查让我知道:http://bugs.mysql.com/bug.php?id=19567(tl;dr,这是 unicode 排序规则的一个已知错误,修复它是“新功能”优先级 - 即,不会在任何时候完成合理的时间范围)。

有没有人发现任何有效的解决方法,允许在 MySQL 中不区分大小写地搜索 unicode 字符?任何想法表示赞赏!

【问题讨论】:

  • 有趣的问题!据我了解这个错误,它与你的问题无关吗?这似乎与口音敏感度有关a => á
  • 你能检查where LOWER(username) LIKE 'ø%'是否有效吗?它可能会受到相同行为的影响,但如果不是,它可能会作为一种解决方法
  • mysql> 从 LOWER(username) LIKE 'ø%' 的用户中选择 1;空组(0.00 秒)没有骰子。似乎 ascii 集之外的 unicode 字符的大小写转换完全无聊。不过感谢您的想法!

标签: mysql unicode collation case-insensitive


【解决方案1】:

5.1.42-community 对我来说很好用

也许你的 mysql 客户端没有正确发送 unicode 字符。我用 sqlYog 进行了测试,它与 utf8_unicode_ci 和 utf8_general_ci 排序规则都工作得很好

【讨论】:

    【解决方案2】:

    如果您关心的是能够通过文本对字段值进行排序而不关心它是大写还是小写,我认为您可以做的最好的事情是解决该字段而不是只输入username,输入LOWER(username) username,然后你就可以完美地使用该字段的订单了,通过它的名字来调用它

    【讨论】:

      【解决方案3】:

      您是否尝试过使用 CONVERT?像

      WHERE `lastname` LIKE CONVERT( _utf8 'ø%' USING latin1 )
      

      可能对你有用。

      【讨论】:

        【解决方案4】:

        我刚刚使用查询解决了同样的问题

        show variables like '%char%';
        

        我的 character_set_client 设置为“utf8”,但 character_set_connection 和 character_set_results 设置为“latin1”。因此,函数 UPPER、LOWER、LIKE 没有按预期工作。

        我刚刚插入了一行

        mysql_query("SET NAMES utf8");
        

        在连接后立即进行不区分大小写的搜索工作。

        【讨论】:

          猜你喜欢
          • 2011-06-01
          • 2019-06-19
          • 2016-12-19
          • 2011-05-11
          • 2011-01-03
          • 2014-05-10
          • 2015-07-07
          • 2012-01-12
          • 2011-03-18
          相关资源
          最近更新 更多