MySQL中存在多种格式的utf8编码,其中最常见的两种为:
- utf8_bin
- utf8_general_ci
utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写;
utf8_genera_ci不区分大小写,ci 为 case insensitive的缩写,即大小写不敏感,为utf8默认编码。
CREATE TABLE `t_bin` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `t_ci` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
CREATE TABLE `t_default` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into t_bin values (1, 'Alex'); //可以插入
insert into t_bin values (2, 'alex'); //可以插入
insert into t_ci values (1, 'Alex'); //可以插入
insert into t_ci values (2, 'alex'); //[Err] 1062 - Duplicate entry 'alex' for key 'uk_name'
insert into t_default values (1, 'Alex'); //可以插入
insert into t_default values (2, 'alex'); //[Err] 1062 - Duplicate entry 'alex' for key 'uk_name'
最终t_bin表中会有两条记录,而t_ci和t_default表中,只有第一条记录。
分析:
-
编码为utf8_bin时,Alex和alex被认为是两个不同的值,区分大小写;
-
编码为utf8_general_ci时,即默认的编码时,Alex和alex被认为是相同的值,不区分大小写。
所以在选择编码的时候应该注意区分。
本文详细解析了MySQL中utf8_bin和utf8_general_ci编码的区别,通过实例对比展示了两者在大小写敏感性和唯一性约束上的不同表现。
810

被折叠的 条评论
为什么被折叠?



