使用 utf8_general_ci 排序规则和 utf8 字符集服务器的德语变音符号的搜索结果区分大小写

Posted

技术标签:

【中文标题】使用 utf8_general_ci 排序规则和 utf8 字符集服务器的德语变音符号的搜索结果区分大小写【英文标题】:Search result is case sensitive for German umlauts with utf8_general_ci collation and utf8 character-set-server 【发布时间】:2017-10-26 08:32:25 【问题描述】:

mysql 5.5 中,。我的数据库表中有 2 个值,例如 öder 和 Öder。当我运行查询以搜索字符串时,使用关键字“Öder”,仅检索Öder作为搜索结果,不检索以ö开头的值,即“örder”。如果我在MySQL服务器的my.cnf文件中将字符集服务器更改为latin1并排序为latin1_general_ci(相同的字符集和排序规则更改为我为相应的数据库和表所做的 latin1),它工作正常,即两个值都作为搜索结果检索。但是有没有一种方法可以使用 utf8 作为对德语变音符号进行不区分大小写的搜索character-set-server?面临这个问题的其他单词也开始并包含其他德语变音符号,如 ü,Ü,ä,Ä。

【问题讨论】:

没有排序规则会处理'örder = öder -- 这是一个错字吗?此外,请说明您是否希望 öder 匹配 oder - 即重音去除,与大小写折叠无关。 如果我用 Ö 搜索,则不会检索到以 ö 开头的单词。我不关心订单是否匹配。我只处理 Öder 和 örder。 【参考方案1】:

使用mysql命令行工具进行测试:

mysql> SELECT 'Ö' = 'ö' COLLATE utf8_general_ci;
+-------------------------------------+
| 'Ö' = 'ö' COLLATE utf8_general_ci   |
+-------------------------------------+
|                                   1 |
+-------------------------------------+

1 表示true0 表示false

任何utf8_..._ci 排序规则都会将一堆重音/非重音、大写/小写字符视为相同。例如,utf8mb4_german2_ci 表示它们相等:O=o=º=Ò=Ó=Ô=Õ=ò=ó=ô=õ 并排在oe=Ö=ö=Œ=œ 之前。

Here 概述了大多数字母在大多数 utf8 排序规则中的位置。

对于大多数用法,_general_ci 不如 _unicode_ci,后者不如 _unicode_520_ci,后者将在 MySQL 8.0 中被 Unicode 9.0 标准取代。

我认为 german2 是针对“电话簿”整理的。但也许不是。在 8.0 中,utf8mb4_german2_ci 整理 D=d=Ď=ď < Dž=dz=dž < Ð=ð。但是utf8mb4_de_pb_0900_ai_ciD=d=Ð=ð=Ď=ď < Dž=dz=dž。更多详情here.

【讨论】:

以上是关于使用 utf8_general_ci 排序规则和 utf8 字符集服务器的德语变音符号的搜索结果区分大小写的主要内容,如果未能解决你的问题,请参考以下文章

使用 utf8_general_ci 排序规则和 utf8 字符集服务器的德语变音符号的搜索结果区分大小写

MySQL - 用于操作“UNION”的排序规则(utf8_general_ci,COERCIBLE)和(latin1_swedish_ci,IMPLICIT)的非法混合

MySQL 排序规则:latin1_swedish_ci 与 utf8_general_ci

ResultSet.updateRow() 产生“用于操作'<=>'的排序规则(latin1_bin,IMPLICIT)和(utf8_general_ci,COERCIBLE)的非法混合”

操作“=”的排序规则(utf8mb4_unicode_ci,EXPLICIT)和(utf8_general_ci,COERCIBLE)的非法混合

Jira中的Mysql错误“操作'='的排序规则(latin1_swedish_ci,I MPLICIT)和(utf8_general_ci,COERCIBLE)的非法混合”[重复]