【问题标题】:MySQL - Why are COLLATION rules ignored by LIKE operator for German ß characterMySQL - 为什么 LIKE 运算符忽略德语 ß 字符的 COLLATION 规则
【发布时间】:2011-10-27 14:24:52
【问题描述】:

我在 MySQL 5.0.88 上使用 utf8 字符集和 utf8_unicode_ci 排序规则运行以下选择语句:

SELECT * FROM table WHERE surname = 'abcß';

+----+-------------------+------+
| id | forename    | surname    |
+----+-------------------+------+
|  1 | a           | abcß       |
|  2 | b           | abcss      |
+----+-------------+------------+

SELECT * FROM table WHERE surname LIKE 'abcß';

+----+-------------------+------+
| id | forename    | surname    |
+----+-------------------+------+
|  1 | a           | abcß       |
+----+-------------+------------+

根据http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html utf8_unicode_ci 的德语特殊字符 ß = ss,但为什么它只适用于“=”运算符而不适用于 LIKE?我有一个电话簿应用程序,我迫切需要这两个东西一起工作。

【问题讨论】:

  • show variables like '%collation%'show full fields from yourtable 显示什么?排序规则必须始终相同。
  • 表的所有 varchar 字段的排序规则都设置为“utf8_unicode_ci”+一些根本没有排序规则的 int 字段。
  • +1 个非常有趣的问题,喜欢听到答案。
  • collat​​ion_connection 是“utf8_unicode_ci”,collat​​ion_database 是“utf8_unicode_ci”,collat​​ion_server 是“latin1_swedish_ci”。但是,我认为服务器排序规则被数据库排序规则覆盖,否则我无法解释为什么它与“=”运算符一起使用

标签: mysql collation sql-like diacritics


【解决方案1】:

根据 SQL 标准,LIKE 在每个字符的基础上执行匹配, 因此它可以产生与 = 比较运算符不同的结果:

mysql> SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
+-----------------------------------------+
| 'ä' LIKE 'ae' COLLATE latin1_german2_ci |
+-----------------------------------------+
|                                       0 |
+-----------------------------------------+
mysql> SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
+--------------------------------------+
| 'ä' = 'ae' COLLATE latin1_german2_ci |
+--------------------------------------+
|                                    1 |
+--------------------------------------+

来源:http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like

【讨论】:

  • 谢谢卡罗利斯。似乎我不能两者兼得,这对于带有许多特殊字符的大型电话簿应用程序来说很糟糕。也许 mysql FULLTEXT 搜索可能是另一种选择。
猜你喜欢
  • 2013-05-15
  • 2017-10-08
  • 1970-01-01
  • 2023-04-04
  • 2012-04-08
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多