MySQL将ÅÄÖ视为AAO?

时间:2010-04-09 11:55:44

标签: mysql unicode encoding collation

这两个查询给出了完全相同的结果:

select * from topics where name='Harligt';
select * from topics where name='Härligt';

这怎么可能?看起来像mysql在搜索时将åäö翻译成aao。有没有办法解决这个问题?

据我所知,我到处都使用utf-8编码。终端和php都会出现同样的问题。

5 个答案:

答案 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 collat​​ion,但您可能应该为整个数据库,所有表,所有varchar列执行此操作。

答案 2 :(得分:1)

要检查排序规则设置,排序规则是设置哪些字符相同的属性。

这2页应该可以帮到你

http://dev.mysql.com/doc/refman/5.1/en/charset-general.html

http://dev.mysql.com/doc/refman/5.1/en/charset-mysql.html

答案 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';

另请参阅https://www.w3schools.com/sql/func_mysql_binary.asp