这两个查询给出了完全相同的结果:
select * from topics where name='Harligt';
select * from topics where name='Härligt';
这怎么可能?看起来像mysql在搜索时将åäö翻译成aao。有没有办法解决这个问题?
据我所知,我到处都使用utf-8编码。终端和php都会出现同样的问题。
答案 0 :(得分:36)
是的,这是非语言特定的unicode排序规则中的标准行为。
9.1.13.1. Unicode Character Sets
为了进一步说明,在utf8_general_ci和utf8_unicode_ci中都存在以下等式(对于比较或进行搜索时的效果,请参见第9.1.7.7节“整理效果示例”):
Ä= A. Ö= O. Ü= U
另见Examples of the effect of collation
你需要
使用没有此“功能”的排序规则(即utf8_bin
,但这会产生其他后果)
仅为查询使用不同的排序规则 。这应该有效:
select * from topics where name='Harligt' COLLATE utf8_bin;
如果您想要不区分大小写LIKE
但不进行Ä = A
变音转换,则会变得更加困难。我知道没有不区分大小写的mySQL排序规则并且不会进行这种隐式变音转换。如果有人知道,我会有兴趣听到它。
相关:
答案 1 :(得分:5)
由于您在瑞典,我建议您使用瑞典语校对。以下是一个显示其差异的示例:
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'
请注意,在此示例中,我只将一列更改为Swedish collation,但您可能应该为整个数据库,所有表,所有varchar列执行此操作。
答案 2 :(得分:1)
答案 3 :(得分:0)
在这里您可以看到一些整理图表。 http://collation-charts.org/mysql60/。我不确定使用的是哪个utf8_general_ci。
这是utf8_swedish_ci的图表。它显示了它解释为相同的字符。 http://collation-charts.org/mysql60/mysql604.utf8_swedish_ci.html
答案 4 :(得分:0)
虽然排序规则是解决此问题的一种方法,但在我看来,更简单的方法是使用BINARY
关键字:
SELECT 'a' = 'ä', BINARY 'a' = 'ä'
将返回1|0
在您的情况下:
SELECT * FROM topics WHERE BINARY name='Härligt';