我有一个带有 utf8_general_ci 编码的 mysql 表,我在其中保存不同语言的数据,主要是英语、土耳其语、波斯语等。问题是 sql 语句:
SELECT * FROM `qkw` WHERE `eword` = 'turk'
返回具有“turk & türk”值的行作为结果。
我对将 ü & u 视为相同的索引有同样的问题。这是 Mysql 中的错误还是我应该使用不同的编码?有什么建议么?
谢谢
此处记录了不同的排序规则,包括您看到的效果;
为了进一步说明,以下等式在 utf8_general_ci 和 utf8_unicode_ci 中都成立(关于这在比较或进行搜索时的影响,请参阅第 10.1.7.8 节,“整理效果的示例”):
Ä = A
Ö = O
Ü = U
如果您不希望这样,您可以从该列表中选择一个不将它们视为等效的排序规则,例如utf8_swedish_ci
.
您最好的选择可能是使用utf8_turkish_ci
排序规则。
它将根据需要区分“u”和“ü”。它是(_ci
后缀)不区分大小写的排序规则:
create table t (v varchar(255)
character set utf8
collate utf8_turkish_ci);
insert into t values ("turk"), ("türk"), ("top"), ("twin");
mysql> select * from t order by v;
+-------+
| v |
+-------+
| türk |
| top |
| turk |
| twin |
+-------+
mysql> select * from t where v = "turk";
+------+
| v |
+------+
| turk |
+------+
mysql> select * from t where v = "TURK";
+------+
| v |
+------+
| turk |
+------+
基于简单地比较每个字符的二进制代码,使用utf8_bin
会产生略有不同的结果。它不仅区分大小写,而且顺序也会不同:
mysql> alter table t change column v v varchar(255) collate utf8_bin;
Query OK, 4 rows affected (0.24 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from t order by v;
+-------+
| v |
+-------+
| top |
| turk |
| twin |
| türk |
+-------+
4 rows in set (0.00 sec)
mysql> select * from t where v = "turk";
+------+
| v |
+------+
| turk |
+------+
1 row in set (0.00 sec)
mysql> select * from t where v = "TURK";
Empty set (0.00 sec)