utf8mb4的大小写敏感性测试及其修改方法
utf8mb4的大小写敏感性测试及其修改方法
utf8mb4_ unicode_ ci 与 utf8mb4_ general_ ci 如何选择
字符除了需要存储,还需要排序或比较大小,涉及到与编码字符集对应的 排序字符集(collation)。ut8mb4对应的排序字符集常用的有 utf8mb4_unicode_ci 、 utf8mb4_general_ci ,到底采用哪个在 stackoverflow 上有个讨论, What’s the difference between utf8_general_ci and utf8_unicode_ci
主要从排序准确性和性能两方面看:
准确性
utf8mb4_unicode_ci 是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序
utf8mb4_general_ci 没有实现Unicode排序规则,在遇到某些特殊语言或字符是,排序结果可能不是所期望的。
但是在绝大多数情况下,这种特殊字符的顺序一定要那么精确吗。比如Unicode把 ? 、 ? 当成 ss 和 OE 来看;而general会把它们当成 s 、 e ,再如 àá??ā? 各自都与 A 相等。
性能
utf8mb4_general_ci 在比较和排序的时候更快
utf8mb4_unicode_ci 在特殊情况下,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。
但是在绝大多数情况下,不会发生此类复杂比较。general理论上比Unicode可能快些,但相比现在的CPU来说,它远远不足以成为考虑性能的因素,索引涉及、SQL设计才是。 我个人推荐是 utf8mb4_unicode_ci ,将来 8.0 里也极有可能使用变为默认的规则。
- # 测试utf8mb4的大小写敏感性及其修改方法
- -- 以下是utf8mb4不区分大小写
- # 修改数据库:
- ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
- # 修改表:
- ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
- # 修改表字段:
- ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL;
- -- 以下是utf8mb4区分大小写
- # 修改数据库:
- ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;
- # 修改表:
- ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
- # 修改表字段:
- ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL ;
- -- 1、删除库 drop database if exists db2020;
- mysql> drop database if exists db2020;
- Query OK, 0 rows affected, 1 warning (0.00 sec)
- -- 2、创建字符集为utf8的库 create database db2020 DEFAULT CHARACTER SET utf8mb4;
- mysql> create database db2020 DEFAULT CHARACTER SET utf8mb4;
- Query OK, 1 row affected (0.00 sec)
- -- 3、查看建库语句 show create database db2020;
- mysql> show create database db2020;
- +----------+--------------------------------------------------------------------+
- | Database | Create Database |
- +----------+--------------------------------------------------------------------+
- | db2020 | CREATE DATABASE `db2020` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
- +----------+--------------------------------------------------------------------+
- 1 row in set (0.00 sec)
- -- 4、创建测试表和数据 use db2020;
- -- drop table if exists tbl_test ;
- create table tbl_test (
- id bigint(20) NOT NULL AUTO_INCREMENT,
- name varchar(20) NOT NULL,
- PRIMARY KEY (id),
- KEY idx_name (name)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;
- -- 5、查看创建表的语句
- -- use db2020;
- show create table tbl_test\G;
- mysql> show create table tbl_test\G;
- *************************** 1. row ***************************
- Table: tbl_test
- Create Table: CREATE TABLE `tbl_test` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT,
- `name` varchar(20) NOT NULL,
- PRIMARY KEY (`id`),
- KEY `idx_name` (`name`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
- 1 row in set (0.05 sec)
- ERROR:
- No query specified
- -- 6、查看默认字符集
- -- 方法1、show variables like '%character%';
- mysql> show variables like '%character%';
- +--------------------------+----------------------------------------------------------------+
- | Variable_name | Value |
- +--------------------------+----------------------------------------------------------------+
- | character_set_client | utf8 |
- | character_set_connection | utf8 |
- | character_set_database | utf8mb4 |
- | character_set_filesystem | binary |
- | character_set_results | utf8 |
- | character_set_server | utf8mb4 |
- | character_set_system | utf8 |
- | character_sets_dir | /opt/mysql/mysql-5.6.43-linux-glibc2.12-x86_64/share/charsets/ |
- +--------------------------+----------------------------------------------------------------+
- 8 rows in set (0.00 sec)
- -- 方法2、show variables like 'collation%';
- mysql> show variables like 'collation%';
- +----------------------+--------------------+
- | Variable_name | Value |
- +----------------------+--------------------+
- | collation_connection | utf8_general_ci |
- | collation_database | utf8mb4_general_ci |
- | collation_server | utf8mb4_general_ci |
- +----------------------+--------------------+
- 3 rows in set (0.00 sec)
- -- 8、查看默认校对规则 show collation like 'utf8mb4%';
- mysql> show collation like 'utf8mb4%';
- +------------------------+---------+-----+---------+----------+---------+
- | Collation | Charset | Id | Default | Compiled | Sortlen |
- +------------------------+---------+-----+---------+----------+---------+
- | utf8mb4_general_ci | utf8mb4 | 45 | Yes | Yes | 1 |
- | utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 |
- | utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 |
- ......
- ......
- +------------------------+---------+-----+---------+----------+---------+
- 26 rows in set (0.52 sec)
- -- 9、插入测试数据
- -- use db2020;
- insert into tbl_test(name) values('aaa');
- insert into tbl_test(name) values('bbb');
- insert into tbl_test(name) values('AAA');
- insert into tbl_test(name) values('BBB');
- mysql> select * from tbl_test;
- +----+------+
- | id | name |
- +----+------+
- | 1 | aaa |
- | 3 | AAA |
- | 2 | bbb |
- | 4 | BBB |
- +----+------+
- 4 rows in set (0.08 sec)
- mysql> select * from tbl_test where name='aaa';
- +----+------+
- | id | name |
- +----+------+
- | 1 | aaa |
- | 3 | AAA |
- +----+------+
- 2 rows in set (0.04 sec)
- use db2020;
- insert into tbl_test(name) values('aaa');
- insert into tbl_test(name) values('bbb');
- insert into tbl_test(name) values('AAA');
- insert into tbl_test(name) values('BBB');
- mysql> select * from tbl_test;
- +----+------+
- | id | name |
- +----+------+
- | 1 | aaa |
- | 3 | AAA |
- | 2 | bbb |
- | 4 | BBB |
- +----+------+
- 4 rows in set (0.00 sec)
- mysql> select * from tbl_test where name='aaa';
- +----+------+
- | id | name |
- +----+------+
- | 1 | aaa |
- | 3 | AAA |
- +----+------+
- 2 rows in set (0.00 sec)
- -- 10、默认情况下,不区分大小写,修改成大小写敏感
- -- alter database db2020 character set=utf8mb4;
- alter database db2020 character set=utf8mb4 collate=utf8mb4_bin;
- -- alter table tbl_test convert to character set utf8mb4 ;
- alter table tbl_test convert to character set utf8mb4 collate utf8mb4_bin;
- -- 只修改这个即可实现区分大小写
- -- alter table tbl_test change name name varchar(20) character set utf8mb4 collate utf8mb4_general_ci not null;
- -- alter table tbl_test modify name varchar(20) character set utf8mb4 collate utf8mb4_general_ci not null;
- alter table tbl_test change name name varchar(20) character set utf8mb4 collate utf8mb4_bin not null;
- alter table tbl_test modify name varchar(20) character set utf8mb4 collate utf8mb4_bin not null;
- mysql> alter database db2020 character set=utf8mb4 collate=utf8mb4_bin;
- Query OK, 1 row affected (0.00 sec)
- mysql> show create database db2020;
- +----------+----------------------------------------------------------------------------------------+
- | Database | Create Database |
- +----------+----------------------------------------------------------------------------------------+
- | db2020 | CREATE DATABASE `db2020` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */ |
- +----------+----------------------------------------------------------------------------------------+
- 1 row in set (0.00 sec)
- mysql> select * from tbl_test where name='aaa';
- +----+------+
- | id | name |
- +----+------+
- | 1 | aaa |
- | 3 | AAA |
- +----+------+
- 2 rows in set (0.00 sec)
- -- 此时只修改库级别的还不行,仍然还需要修改表级别的
- mysql> alter table tbl_test convert to character set utf8mb4 collate utf8mb4_bin;
- Query OK, 4 rows affected (0.08 sec) Records: 4 Duplicates: 0 Warnings: 0
- mysql> select * from tbl_test where name='aaa';
- +----+------+
- | id | name |
- +----+------+
- | 1 | aaa |
- +----+------+
- 1 row in set (0.00 sec)
- -- 附录 修改MySQL配置文件,新增如下参数:
- [client]
- default-character-set = utf8mb4
- [mysql]
- default-character-set = utf8mb4
- [mysqld]
- character-set-client-handshake = FALSE
- character-set-server = utf8mb4
- collation-server = utf8mb4_unicode_ci
- init_connect='SET NAMES utf8mb4'
utf8mb4的大小写敏感性测试及其修改方法的更多相关文章
- utf8的大小写敏感性测试及其修改方法
utf8的大小写敏感性测试及其修改方法 # 测试utf8的大小写敏感性及其修改方法 -- 以下是utf8不区分大小写 # 修改数据库: ALTER DATABASE database_name CHA ...
- web测试要点、方法_web端测试大全总结
一.功能测试 1.1链接测试 链接是web应用系统的一个很重要的特征,主要是用于页面之间切换跳转,指导用户去一些不知道地址的页面的主要手段,链接测试一般关注三点: 1)链接是否按照既定指示那样,确实链 ...
- BluetoothChat用于蓝牙串口通信的修改方法
本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车.界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信. SPP-CA模块自带代码,在这 ...
- as关键词还有另外一个用途,那就是修改 方法 的访问控制
PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法.php的Traits和Go语言的组合功能类似,通过在类中使用use关键字声明要组合的Trait ...
- debug运行可以,release运行报错的原因及修改方法
通常我们开发的程序有2种模式:Debug模式和Release模式在Debug模式下,编译器会记录很多调试信息,也可以加入很多测试代码,方便我们程序员测试,以及出现bug时的分析解决Release模式下 ...
- mysql8.0数据库忘记密码时进行修改方法
最近安装mysql8.0数据库,用以前的修改mysql方法,没有成功,所以参考网上前辈的做法,自己重新整理了下忘记密码时进行修改方法 1.安装mysql8.0后发现,在安装目中,是没有my.ini 和 ...
- dedecms5.7二级域名文章图片不显示修改方法.相对路径改为绝对路径的方法
dedecms5.7(织梦CMS5.7)二级域名文章图片不显示修改方法.相对路径改为绝对路径的方法 dedecms升级到5.7SP1后,开启二级域名,你会发现,在二级域名下的文章,上传的图片地址都是: ...
- Windows开启关闭测试模式的方法(含开启测试模式失败的解决办法)
前言: 内含:Windows开启关闭测试模式的方法.开启测试模式失败的解决办法.win10进入bios的方式.BitLocker恢复方式. 对于互联网从业者来说 ...
- Magento后台手动修改订单状态方法及手动修改方法php
订单详细内容页手动修改订单状态方法: 打开此文件:app\design\adminhtml\default\default\template\sales\order\view\history.phtm ...
随机推荐
- PowerDesigner 使用教程(很具体,很实用)
原文地址为:PowerDesigner 使用教程(很具体,很实用) 1.PowerDesigner 使用教程 从今日开始,每天一部分内容,在每个工作日,争取让大家天天都有的看,每天内容不会太多. 有错 ...
- 不能收缩 ID 为 %s 的数据库中 ID 为 %s 的文件,因为它正由其他进程收缩或为空。
SQLServer数据库通常都不建议进行SHRINKFILE操作,因为SHRINKFILE不当会造成一定的性能问题. 但是当进行了某些操作(例如某个超大的日志类型表转成分区表切换了数据文件),数据库某 ...
- lnmp环境里安装mssql及mssql的php扩展
小活中用到mssql,于是在自己lnmp环境中安装各mssql数据库 步骤如下: 源码编译安装 (1)下载freetds-stable-0.91源码:http://download.csdn.net/ ...
- Github上如何查看当前最流行的开源项目
先声明下:只针对初学者,大神的话勿喷. 针对题标的这个问题,按照如下步骤操作即可: 进入Github网站后,显示的页面如下所示: 点击"Explore"链接,进入如下页面: 页面上 ...
- apache https配置【转】
博文来源:apache https配置 参考博文:apache.nginx配置自签名证书 1. 确认是否安装ssl模块 是否有mod_ssl.so文件 2. 生成证书和密钥 linux下 步骤1: ...
- topjui中combobox使用
1.创建combobox的方法 常用的一种是通过Js定义,一种是通过在input输入框中定义,还有一种通过在selete标签中定义,可以去看easyui的官方文档 http://www.jeasyui ...
- 【字】biang
biang biang面的名字由来:biangbiang面是陕西关中地区的一中地区美食,因为在做这种面时会发出biang biang的声音,biang biang面因此得名.biang字简体共有42笔 ...
- python之常用模块
python 常用模块 之 (subprocess模块.logging模块.re模块) python 常用模块 之 (序列化模块.XML模块.configparse模块.hashlib模块) pyth ...
- 开放数据接口 API 简介与使用场景、调用方法
此文章对开放数据接口 API 进行了功能介绍.使用场景介绍以及调用方法的说明,供用户在使用数据接口时参考之用. 在给大家分享的一系列软件开发视频课程中,以及在我们的社区微信群聊天中,都积极地鼓励大家开 ...
- MySQL数据类型的选择
+++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据类型的选择时间:2019年2月22日内容:MySQL数据类型的选择范式参考重点:主要讲述MyS ...