我有一个字段表使用编码utf8和collation 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中为索引设置排序规则.
此问题的解决方案包括插入或触发前的唯一性检查.两者都不如使用唯一索引优雅.
嗯,有两种方法可以实现这一点:
情况 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)
请注意:
aa案例 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)
请注意:
a因此,以上两者都将解决您的目的。也就是说,它们都允许使用“abc”、“Abc”、“ABC”、“aBc”等值,但如果大小写匹配,则不允许再次使用相同的值。
请注意,给出“_bin”排序规则与使用二进制数据类型不同。所以请随意参考以下链接:
希望以上内容对您有所帮助!