Mar*_*tin 31 mysql unicode encoding collation
这两个查询给了我完全相同的结果:
select * from topics where name='Harligt';
select * from topics where name='Härligt';
Run Code Online (Sandbox Code Playgroud)
这怎么可能?看起来像mysql在搜索时将åäö翻译成aao.有什么办法可以解决这个问题吗?
据我所知,我到处都使用utf-8编码.终端和php都会出现同样的问题.
Pek*_*ica 36
是的,这是非语言特定的unicode排序规则中的标准行为.
为了进一步说明,在utf8_general_ci和utf8_unicode_ci中都存在以下等式(对于比较或执行搜索时的效果,请参见第9.1.7.7节"排序效果的示例"):
Ä=AÖ=OÜ= U.
另请参见整理效果的示例
你需要
使用没有此"功能"的排序规则(即utf8_bin
,但有其他后果)
仅为查询使用不同的排序规则.这应该工作:
select * from topics where name='Harligt' COLLATE utf8_bin;
Run Code Online (Sandbox Code Playgroud)如果你想要做一个区分大小写变得更加困难LIKE
,但不具有Ä = A
变音功能.我知道没有不区分大小写的mySQL排序规则并且不会进行这种隐式变音转换.如果有人知道,我有兴趣听到它.
有关:
由于你在瑞典,我建议使用瑞典校对.这是一个示例,显示了它的不同之处:
CREATE TABLE topics (name varchar(100) not null) CHARACTER SET utf8;
INSERT topics (name) VALUES ('Härligt');
select * from topics where name='Harligt';
'Härligt'
select * from topics where name='Härligt';
'Härligt'
ALTER TABLE topics MODIFY name VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_swedish_ci;
select * from topics where name='Harligt';
<no results>
select * from topics where name='Härligt';
'Härligt'
Run Code Online (Sandbox Code Playgroud)
请注意,在此示例中,我只将一列更改为Swedish collation,但您可能应该为整个数据库,所有表,所有varchar列执行此操作.