我有一个带有utf8_general_ci编码的mysql表,我用不同的语言保存数据,主要是英语,土耳其语,波斯语等。 问题是sql语句:
SELECT * FROM `qkw` WHERE `eword` = 'turk'
返回带有“turk&türk”值的行。
我对索引有同样的问题,对待ü&你也一样。这是Mysql中的错误还是我应该使用不同的编码?有什么建议吗?
由于
答案 0 :(得分:1)
记录了不同的排序规则here,包括您所看到的效果;
为了进一步说明,在utf8_general_ci和utf8_unicode_ci中都存在以下等式(对于比较或进行搜索时的效果,请参见第10.1.7.8节“整理效果示例”):
Ä= A
Ö= O
Ü= U
如果您不希望这样,您可以从该列表中选择不会将其视为等效的排序规则,例如utf8_swedish_ci
。
答案 1 :(得分:1)
您最好的选择可能是使用utf8_turkish_ci
整理。
它会根据您的意愿区分“你”和“ü”。它是(_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)