【问题标题】:Is there a MySQL utf8 collation that will not conflate accented characters?是否有不会混淆重音字符的 MySQL utf8 排序规则?
【发布时间】:2011-10-01 17:27:36
【问题描述】:

我有一个 utf8 表,正在存储如下数据:

+-------+--------+
| name  | gender |
+-------+--------+
| ESMÉ  | F      | 
| ESME  | F      | 
+-------+--------+

但是,当我尝试在 (name,gender) 上添加唯一键时,这两行违反了约束。我已经能够使用 utf8_bin 排序规则实现我的目标,但是我失去了不区分大小写的功能。

所以我想我真正想要的是一种存储 utf8 数据的方法,但在我的唯一键中没有重音和非重音字符被视为等效。

【问题讨论】:

  • 您可以使用 varbinary 列,它完全忽略排序规则设置强加的任何相等性。我不认为我推荐这是一个好主意,我只是说它可能。

标签: mysql utf-8 collation


【解决方案1】:

我不认为你想要的东西是直接可能的。 collat​​ion 决定了日期的排序和比较方式。对于您的键,您希望两个值被视为不同,但在您的正常比较中,您希望它们被视为相同。

在指定查询时有一个技巧:只需将结果转换为 utf8 而不指定排序规则。这将转换结果并将排序规则设置回默认值。

以下示例向您展示了我的意思:

mysql> show create table test_col;
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                        |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_col | CREATE TABLE `test_col` (
  `name` varchar(200) COLLATE utf8_bin DEFAULT NULL,
  UNIQUE KEY `ixuniq` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> insert into test_col (name) values ('Y'),(unhex('c39d'));Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test_col;
+------+
| name |
+------+
| Y    |
| Ý   |
+------+
2 rows in set (0.00 sec)

mysql> select * from test_col where name='Y';
+------+
| name |
+------+
| Y    |
+------+
1 row in set (0.00 sec)

mysql> select * from test_col where convert(name using 'utf8')='y';+------+
| name |
+------+
| Y    |
| Ý   |
+------+
2 rows in set (0.00 sec)

【讨论】:

    【解决方案2】:

    我有完全相同的问题,排序规则存在于拉丁语中,它是 latin1_general_ci 但在 utf8 中不存在。 您有 3 个解决方案:

    【讨论】:

      猜你喜欢
      • 2013-09-13
      • 2013-08-05
      • 2011-11-28
      • 2015-07-13
      • 2021-11-03
      • 2013-01-02
      • 2014-01-24
      • 1970-01-01
      相关资源
      最近更新 更多