MySQL之utf8_bin和utf8_general_ci编码的区别

本文详细解析了MySQL中utf8_bin和utf8_general_ci编码的区别,通过实例对比展示了两者在大小写敏感性和唯一性约束上的不同表现。

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

  • utf8_bin
  • utf8_general_ci

utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写;
utf8_genera_ci不区分大小写,cicase 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_cit_default表中,只有第一条记录。

分析:

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

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

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

原文来源 https://www.cnblogs.com/zjfjava/p/7639535.html

MySQL中的`utf8mb4`字符集支持多种排序规则(collation),其中`utf8mb4_bin``utf8mb4_general_ci`是两种常见的排序规则,它们在排序比较行为上有显著的区别。 ### 排序规则概述 - `utf8mb4_bin`:按照二进制编码逐字节进行比较,区分大小写重音符号。这意味着在比较字符串时,每个字符的字节值都会被精确地比较。例如,`'a'``'A'`会被视为不同的字符串,`'résumé'``'resume'`也会被视为不同的字符串。 - `utf8mb4_general_ci`:不区分大小写重音符号,CI代表“Case Insensitive”。这意味着在比较字符串时,大小写重音符号会被忽略。例如,`'a'``'A'`会被视为相同的字符串,`'résumé'``'resume'`也会被视为相同的字符串。 ### 区别 1. **大小写敏感性**: - `utf8mb4_bin`区分大小写,因此`'a'``'A'`被视为不同的字符。 - `utf8mb4_general_ci`不区分大小写,因此`'a'``'A'`被视为相同的字符。 2. **重音符号敏感性**: - `utf8mb4_bin`区分重音符号,因此`'é'``'e'`被视为不同的字符。 - `utf8mb4_general_ci`不区分重音符号,因此`'é'``'e'`被视为相同的字符。 3. **性能**: - `utf8mb4_general_ci`在比较时速度更快,因为它不需要进行逐字节的比较。 - `utf8mb4_bin`在比较时速度较慢,因为它需要进行逐字节的比较。 4. **适用场景**: - `utf8mb4_general_ci`适用于对大小写或重音符号不敏感的文本,如用户名、标题等。 - `utf8mb4_bin`适用于严格区分大小写的场景,如密码、文件名、唯一标识符等。 ### 示例代码 以下是一个简单的SQL示例,展示了不同排序规则下的比较行为: ```sql -- 使用 utf8mb4_general_ci 进行比较 SELECT 'a' = 'A' COLLATE utf8mb4_general_ci AS result; -- 结果是 TRUE -- 使用 utf8mb4_bin 进行比较 SELECT 'a' = 'A' COLLATE utf8mb4_bin AS result; -- 结果是 FALSE ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值