MySQL 将 ÅÄÖ 视为 AAO?

Posted

技术标签:

【中文标题】MySQL 将 ÅÄÖ 视为 AAO?【英文标题】:MySQL treats ÅÄÖ as AAO? 【发布时间】:2011-02-06 02:52:51 【问题描述】:

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

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

这怎么可能?似乎 mysql 在搜索时将 åäö 翻译为 aao。有什么办法可以关闭它吗?

据我所知,我在任何地方都使用 utf-8 编码。终端和php都会出现同样的问题。

【问题讨论】:

【参考方案1】:

是的,这是非语言特定的 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 排序规则。如果有人知道,我很想知道。

相关:

Looking for case insensitive MySQL collation where “a” != “ä” MYSQL case sensitive search for utf8_bin field

【讨论】:

【参考方案2】:

由于您在瑞典,我建议您使用瑞典排序规则。下面是一个例子,展示了它的不同之处:

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'

请注意,在此示例中,我仅将一列更改为瑞典排序规则,但您可能应该为整个数据库、所有表、所有 varchar 列执行此操作。

【讨论】:

这应该适用于瑞典语以外的其他语言,所以我认为 utf8_bin 是我想要的排序规则,但感谢您让我知道我只能更改一列的排序规则,这将非常有帮助。 请注意,utf8_bin 区分大小写,因此 "härligt" != "Härligt"(也适用于唯一索引)。【参考方案3】:

虽然排序规则是解决此问题的一种方法,但在我看来更直接的方法是 BINARY 关键字:

 SELECT 'a' = 'ä', BINARY 'a' = 'ä'

将返回1|0

在你的情况下:

SELECT * FROM topics WHERE BINARY name='Härligt';

另见https://www.w3schools.com/sql/func_mysql_binary.asp

【讨论】:

【参考方案4】:

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

这两页应该对你有帮助

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

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

【讨论】:

【参考方案5】:

在这里您可以看到一些排序规则图表。 http://collation-charts.org/mysql60/。我不确定哪个是使用的 utf8_general_ci。

这是 utf8_swedish_ci 的图表。它显示了它解释为相同的字符。 http://collation-charts.org/mysql60/mysql604.utf8_swedish_ci.html

【讨论】:

以上是关于MySQL 将 ÅÄÖ 视为 AAO?的主要内容,如果未能解决你的问题,请参考以下文章

使用 jquery 发布和返回数据会损坏 å ä ö

URL 中是不是允许扩展 ASCII 字符 [äöå]?

(问号) 而不是旧页面上的ÅÄÖ

带有 åäö(特殊字符)的 Alamofire GET 请求,无效 url

ÅÄÖ:啥被认为是对 SEO 更友好的 URL

ASP.Net mvc5 我的网站不允许'åäö'