1

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

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

返回具有“turk & türk”值的行作为结果。

我对将 ü & u 视为相同的索引有同样的问题。这是 Mysql 中的错误还是我应该使用不同的编码?有什么建议么?

谢谢

4

2 回答 2

1

此处记录了不同的排序规则,包括您看到的效果;

为了进一步说明,以下等式在 utf8_general_ci 和 utf8_unicode_ci 中都成立(关于这在比较或进行搜索时的影响,请参阅第 10.1.7.8 节,“整理效果的示例”):

Ä = A
Ö = O
Ü = U

如果您不希望这样,您可以从该列表中选择一个不将它们视为等效的排序规则,例如utf8_swedish_ci.

于 2013-08-10T08:21:32.137 回答
1

您最好的选择可能是使用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)
于 2013-08-10T10:57:45.060 回答