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?的主要内容,如果未能解决你的问题,请参考以下文章