utf8_bin和utf8_general_ci编码的区别

August 29, 2020

本文主要介绍了MySQL中utf8_bin和utf8_general_ci两种编码格式的区别。utf8_bin编码将字符串中的每个字符用二进制数据存储,区分大小写。而utf8_general_ci编码则不区分大小写,是utf8的默认编码。通过实例演示了在插入数据时,两种编码方式对大小写的处理差异。因此,在选择编码时,应注意这种区别。

MySQL中存在多种格式的utf8编码,其中最常见的两种为:

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');
 
insert into t_default values (1, 'Alex');
insert into t_default values (2, 'alex');

结果如下:

root@zow 11:13:44>insert into t_bin values (1, 'Alex');
Query OK, 1 row affected (0.01 sec)
  
root@zow 11:14:14>insert into t_bin values (2, 'alex');
Query OK, 1 row affected (0.01 sec)
  
root@zow 11:14:17>insert into t_ci values (1, 'Alex');
Query OK, 1 row affected (0.00 sec)
  
root@zow 11:14:32>insert into t_ci values (2, 'alex');
ERROR 1062 (23000): Duplicate entry 'alex' for key 'uk_name'
root@zow 11:14:36>insert into t_default values (1, 'Alex');
Query OK, 1 row affected (0.01 sec)
 
root@zow 11:14:50>insert into t_default values (2, 'alex');
ERROR 1062 (23000): Duplicate entry 'alex' for key 'uk_name'

分析:

编码为utf8_bin时,Alex和alex被认为是两个不同的值,区分大小写;

编码为utf8_general_ci时,即默认的编码时,Alex和alex被认为是相同的值,不区分大小写。

所以在选择编码的时候应该注意区分。

Mysql编码

IARNO

服务端开发

supervisor管理golang程序

分析Mysql Binlog 日志