使用 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
表示true
; 0
表示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_ci
有D=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)的非法混合”[重复]