MYSQL UTF字符混淆üvsu

时间:2013-08-10 08:07:25

标签: mysql utf-8

我有一个带有utf8_general_ci编码的mysql表,我用不同的语言保存数据,主要是英语,土耳其语,波斯语等。 问题是sql语句:

SELECT * FROM `qkw` WHERE `eword` = 'turk' 

返回带有“turk&türk”值的行。

我对索引有同样的问题,对待ü&你也一样。这是Mysql中的错误还是我应该使用不同的编码?有什么建议吗?

由于

2 个答案:

答案 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)