在 MySQL 中是否可以进行 multi-character-to-single-character 归类?

Are multi-character-to-single-character collations possible in MySQL?

我有一个 MySQL 数据库。每条记录都包含一个标题。一些记录包含带有双 s 的标题 Edelweiss,而其他包含带有 eszett 的标题 Edelweiß

我希望用户能够搜索任一字符串并返回任一拼写的所有结果。

根据我当前的排序规则 -- utf8_general_ci -- 看起来 ß 等同于 s。有没有办法让 ß 等同于 ss,以便搜索 ss 会产生包含 ß?

的结果

下面的这个解决方案可行,但可能不是最好的

SELECT *,replace(fullname,'ss','ß') rep1,replace(fullname,'ß','ss') rep2 
FROM test
HAVING rep1 like '%ß%' or rep2 like '%ß%';

OR

SELECT *,replace(fullname,'ss','ß') rep1,replace(fullname,'ß','ss') rep2 
FROM test
HAVING rep1 like '%ss%' or rep2 like '%ss%';

基本上,我创建了两列,将 ss 替换为 ß 并将另一个 ß 替换为 ss 并使用 HAVINGLIKE 的组合来过滤结果。

你也可以这样写

SELECT * FROM test
WHERE replace(fullname,'ss','ß') 
LIKE '%ß%' or replace(fullname,'ß','ss') like '%ß%';

注意:您可以将我写“%ß%”的部分替换为您需要的搜索。例如“%Edelweiß%”

如所见here :

utf8_general_ci 考虑 s=ß
utf8_general_mysql500_ci 表示 ßZ
之后 所有其他 utf8 归类将 ssß 视为相等。

因此,(至少)更改列的排序规则。

注意:所有 _general_ 归类一次只查看一个字符。大多数其他归类更复杂。另一个例子是 ae=ææ 是否被视为单独的 "letter".