区分大小写的唯一性和不区分大小写的搜索

use*_*141 9 mysql collation

我有一个字段表使用编码utf8和collat​​ion utf8_unicode_ci:

CREATE TABLE dictionary (
    a varchar(128) NOT NULL
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

对于具有扩展和连接的有效的不区分大小写的搜索,需要使用排序规则utf8_unicode_ci .为此我有索引:

CREATE INDEX a_idx on dictionary(a);
Run Code Online (Sandbox Code Playgroud)

问题:此外,我必须确保字段a的所有存储值都是唯一的,但是区分大小写.德国的例子:"blühen"和"Blühen"都必须存储在表格中.但是第二次加入"Blühen"是不可能的.

MySQL中是否有内置功能可以兼具?

不幸的是,似乎无法在MySQL 5.1中为索引设置排序规则.

此问题的解决方案包括插入或触发前的唯一性检查.两者都不如使用唯一索引优雅.

Abh*_*hay 5

嗯,有两种方法可以实现这一点:

  1. 使用 _bin 排序规则
  2. 将数据类型更改为 VARBINARY

情况 1:使用 _bin 排序规则

按如下方式创建表:

CREATE TABLE `dictionary` (
 `a` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
 UNIQUE KEY `idx_un_a` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

请注意:

  1. 列的数据类型a
  2. 列上的唯一索引a

案例 2:使用 VARBINARY 数据类型

按如下方式创建表:

CREATE TABLE `dictionary` (
 `a` VARBINARY(128) NOT NULL,
 UNIQUE KEY `idx_uniq_a` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

请注意:

  1. 新数据类型 VARBINARY
  2. 列上的唯一索引a

因此,以上两者都将解决您的目的。也就是说,它们都允许使用“abc”、“Abc”、“ABC”、“aBc”等值,但如果大小写匹配,则不允许再次使用相同的值。

请注意,给出“_bin”排序规则与使用二进制数据类型不同。所以请随意参考以下链接:

  1. BINARY 和 VARBINARY 数据类型
  2. _bin 和二进制排序规则

希望以上内容对您有所帮助!

  • 如果我在where子句中指定的排序规则与表定义中定义的排序规则不同,MySQL将不会使用索引,而是进行全表扫描。对于大表,全表扫描可能需要很长时间,这就是为什么它们可以被认为是低效的。执行“EXPLAIN SELECT * FROM Dictionary WHERE a COLLATE utf8_general_ci = 'abc'”显示表中的所有行均已读取。这至少适用于我的 MySQL 版本(5.0 和 5.1)。如果能有所不同就好了。 (2认同)