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 里也极有可能使用变为默认的规则。

  1. # 测试utf8mb4的大小写敏感性及其修改方法
  2.  
  3. -- 以下是utf8mb4不区分大小写
  4. # 修改数据库:
  5. ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
  6. # 修改表:
  7. ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  8. # 修改表字段:
  9. ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL;
  10.  
  11. -- 以下是utf8mb4区分大小写
  12. # 修改数据库:
  13. ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;
  14. # 修改表:
  15. ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
  16. # 修改表字段:
  17. ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL ;
  1. -- 1、删除库 drop database if exists db2020;
  2. mysql> drop database if exists db2020;
  3. Query OK, 0 rows affected, 1 warning (0.00 sec)
  4. -- 2、创建字符集为utf8的库 create database db2020 DEFAULT CHARACTER SET utf8mb4;
  5. mysql> create database db2020 DEFAULT CHARACTER SET utf8mb4;
  6. Query OK, 1 row affected (0.00 sec)
  7. -- 3、查看建库语句 show create database db2020;
  8. mysql> show create database db2020;
  9. +----------+--------------------------------------------------------------------+
  10. | Database | Create Database |
  11. +----------+--------------------------------------------------------------------+
  12. | db2020 | CREATE DATABASE `db2020` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
  13. +----------+--------------------------------------------------------------------+
  14. 1 row in set (0.00 sec)
  15. -- 4、创建测试表和数据 use db2020;
  16. -- drop table if exists tbl_test ;
  17. create table tbl_test (
  18. id bigint(20) NOT NULL AUTO_INCREMENT,
  19. name varchar(20) NOT NULL,
  20. PRIMARY KEY (id),
  21. KEY idx_name (name)
  22. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;
  23.  
  24. -- 5、查看创建表的语句
  25. -- use db2020;
  26. show create table tbl_test\G;
  27. mysql> show create table tbl_test\G;
  28. *************************** 1. row ***************************
  29. Table: tbl_test
  30. Create Table: CREATE TABLE `tbl_test` (
  31. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  32. `name` varchar(20) NOT NULL,
  33. PRIMARY KEY (`id`),
  34. KEY `idx_name` (`name`)
  35. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  36. 1 row in set (0.05 sec)
  37.  
  38. ERROR:
  39. No query specified
  40. -- 6、查看默认字符集
  41. -- 方法1show variables like '%character%';
  42. mysql> show variables like '%character%';
  43. +--------------------------+----------------------------------------------------------------+
  44. | Variable_name | Value |
  45. +--------------------------+----------------------------------------------------------------+
  46. | character_set_client | utf8 |
  47. | character_set_connection | utf8 |
  48. | character_set_database | utf8mb4 |
  49. | character_set_filesystem | binary |
  50. | character_set_results | utf8 |
  51. | character_set_server | utf8mb4 |
  52. | character_set_system | utf8 |
  53. | character_sets_dir | /opt/mysql/mysql-5.6.43-linux-glibc2.12-x86_64/share/charsets/ |
  54. +--------------------------+----------------------------------------------------------------+
  55. 8 rows in set (0.00 sec)
  56.  
  57. -- 方法2show variables like 'collation%';
  58. mysql> show variables like 'collation%';
  59. +----------------------+--------------------+
  60. | Variable_name | Value |
  61. +----------------------+--------------------+
  62. | collation_connection | utf8_general_ci |
  63. | collation_database | utf8mb4_general_ci |
  64. | collation_server | utf8mb4_general_ci |
  65. +----------------------+--------------------+
  66. 3 rows in set (0.00 sec)
  67.  
  68. -- 8、查看默认校对规则 show collation like 'utf8mb4%';
  69. mysql> show collation like 'utf8mb4%';
  70. +------------------------+---------+-----+---------+----------+---------+
  71. | Collation | Charset | Id | Default | Compiled | Sortlen |
  72. +------------------------+---------+-----+---------+----------+---------+
  73. | utf8mb4_general_ci | utf8mb4 | 45 | Yes | Yes | 1 |
  74. | utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 |
  75. | utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 |
  76. ......
  77. ......
  78. +------------------------+---------+-----+---------+----------+---------+
  79. 26 rows in set (0.52 sec)
  80. -- 9、插入测试数据
  81. -- use db2020;
  82. insert into tbl_test(name) values('aaa');
  83. insert into tbl_test(name) values('bbb');
  84. insert into tbl_test(name) values('AAA');
  85. insert into tbl_test(name) values('BBB');
  86. mysql> select * from tbl_test;
  87. +----+------+
  88. | id | name |
  89. +----+------+
  90. | 1 | aaa |
  91. | 3 | AAA |
  92. | 2 | bbb |
  93. | 4 | BBB |
  94. +----+------+
  95. 4 rows in set (0.08 sec)
  96.  
  97. mysql> select * from tbl_test where name='aaa';
  98. +----+------+
  99. | id | name |
  100. +----+------+
  101. | 1 | aaa |
  102. | 3 | AAA |
  103. +----+------+
  104. 2 rows in set (0.04 sec)
  105.  
  106. use db2020;
  107. insert into tbl_test(name) values('aaa');
  108. insert into tbl_test(name) values('bbb');
  109. insert into tbl_test(name) values('AAA');
  110. insert into tbl_test(name) values('BBB');
  111. mysql> select * from tbl_test;
  112. +----+------+
  113. | id | name |
  114. +----+------+
  115. | 1 | aaa |
  116. | 3 | AAA |
  117. | 2 | bbb |
  118. | 4 | BBB |
  119. +----+------+
  120. 4 rows in set (0.00 sec)
  121. mysql> select * from tbl_test where name='aaa';
  122. +----+------+
  123. | id | name |
  124. +----+------+
  125. | 1 | aaa |
  126. | 3 | AAA |
  127. +----+------+
  128. 2 rows in set (0.00 sec)
  129. -- 10、默认情况下,不区分大小写,修改成大小写敏感
  130. -- alter database db2020 character set=utf8mb4;
  131. alter database db2020 character set=utf8mb4 collate=utf8mb4_bin;
  132. -- alter table tbl_test convert to character set utf8mb4 ;
  133. alter table tbl_test convert to character set utf8mb4 collate utf8mb4_bin;
  134. -- 只修改这个即可实现区分大小写
  135. -- alter table tbl_test change name name varchar(20) character set utf8mb4 collate utf8mb4_general_ci not null;
  136. -- alter table tbl_test modify name varchar(20) character set utf8mb4 collate utf8mb4_general_ci not null;
  137. alter table tbl_test change name name varchar(20) character set utf8mb4 collate utf8mb4_bin not null;
  138. alter table tbl_test modify name varchar(20) character set utf8mb4 collate utf8mb4_bin not null;
  139. mysql> alter database db2020 character set=utf8mb4 collate=utf8mb4_bin;
  140. Query OK, 1 row affected (0.00 sec)
  141. mysql> show create database db2020;
  142. +----------+----------------------------------------------------------------------------------------+
  143. | Database | Create Database |
  144. +----------+----------------------------------------------------------------------------------------+
  145. | db2020 | CREATE DATABASE `db2020` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */ |
  146. +----------+----------------------------------------------------------------------------------------+
  147. 1 row in set (0.00 sec)
  148. mysql> select * from tbl_test where name='aaa';
  149. +----+------+
  150. | id | name |
  151. +----+------+
  152. | 1 | aaa |
  153. | 3 | AAA |
  154. +----+------+
  155. 2 rows in set (0.00 sec)
  156. -- 此时只修改库级别的还不行,仍然还需要修改表级别的
  157. mysql> alter table tbl_test convert to character set utf8mb4 collate utf8mb4_bin;
  158. Query OK, 4 rows affected (0.08 sec) Records: 4 Duplicates: 0 Warnings: 0
  159. mysql> select * from tbl_test where name='aaa';
  160. +----+------+
  161. | id | name |
  162. +----+------+
  163. | 1 | aaa |
  164. +----+------+
  165. 1 row in set (0.00 sec)
  166. -- 附录 修改MySQL配置文件,新增如下参数:
  167. [client]
  168. default-character-set = utf8mb4
  169.  
  170. [mysql]
  171. default-character-set = utf8mb4
  172.  
  173. [mysqld]
  174. character-set-client-handshake = FALSE
  175. character-set-server = utf8mb4
  176. collation-server = utf8mb4_unicode_ci
  177. init_connect='SET NAMES utf8mb4'

utf8mb4的大小写敏感性测试及其修改方法的更多相关文章

  1. utf8的大小写敏感性测试及其修改方法

    utf8的大小写敏感性测试及其修改方法 # 测试utf8的大小写敏感性及其修改方法 -- 以下是utf8不区分大小写 # 修改数据库: ALTER DATABASE database_name CHA ...

  2. web测试要点、方法_web端测试大全总结

    一.功能测试 1.1链接测试 链接是web应用系统的一个很重要的特征,主要是用于页面之间切换跳转,指导用户去一些不知道地址的页面的主要手段,链接测试一般关注三点: 1)链接是否按照既定指示那样,确实链 ...

  3. BluetoothChat用于蓝牙串口通信的修改方法

    本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车.界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信. SPP-CA模块自带代码,在这 ...

  4. as关键词还有另外一个用途,那就是修改 方法 的访问控制

    PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法.php的Traits和Go语言的组合功能类似,通过在类中使用use关键字声明要组合的Trait ...

  5. debug运行可以,release运行报错的原因及修改方法

    通常我们开发的程序有2种模式:Debug模式和Release模式在Debug模式下,编译器会记录很多调试信息,也可以加入很多测试代码,方便我们程序员测试,以及出现bug时的分析解决Release模式下 ...

  6. mysql8.0数据库忘记密码时进行修改方法

    最近安装mysql8.0数据库,用以前的修改mysql方法,没有成功,所以参考网上前辈的做法,自己重新整理了下忘记密码时进行修改方法 1.安装mysql8.0后发现,在安装目中,是没有my.ini 和 ...

  7. dedecms5.7二级域名文章图片不显示修改方法.相对路径改为绝对路径的方法

    dedecms5.7(织梦CMS5.7)二级域名文章图片不显示修改方法.相对路径改为绝对路径的方法 dedecms升级到5.7SP1后,开启二级域名,你会发现,在二级域名下的文章,上传的图片地址都是: ...

  8. Windows开启关闭测试模式的方法(含开启测试模式失败的解决办法)

    前言:           内含:Windows开启关闭测试模式的方法.开启测试模式失败的解决办法.win10进入bios的方式.BitLocker恢复方式.           对于互联网从业者来说 ...

  9. Magento后台手动修改订单状态方法及手动修改方法php

    订单详细内容页手动修改订单状态方法: 打开此文件:app\design\adminhtml\default\default\template\sales\order\view\history.phtm ...

随机推荐

  1. PowerDesigner 使用教程(很具体,很实用)

    原文地址为:PowerDesigner 使用教程(很具体,很实用) 1.PowerDesigner 使用教程 从今日开始,每天一部分内容,在每个工作日,争取让大家天天都有的看,每天内容不会太多. 有错 ...

  2. 不能收缩 ID 为 %s 的数据库中 ID 为 %s 的文件,因为它正由其他进程收缩或为空。

    SQLServer数据库通常都不建议进行SHRINKFILE操作,因为SHRINKFILE不当会造成一定的性能问题. 但是当进行了某些操作(例如某个超大的日志类型表转成分区表切换了数据文件),数据库某 ...

  3. lnmp环境里安装mssql及mssql的php扩展

    小活中用到mssql,于是在自己lnmp环境中安装各mssql数据库 步骤如下: 源码编译安装 (1)下载freetds-stable-0.91源码:http://download.csdn.net/ ...

  4. Github上如何查看当前最流行的开源项目

    先声明下:只针对初学者,大神的话勿喷. 针对题标的这个问题,按照如下步骤操作即可: 进入Github网站后,显示的页面如下所示: 点击"Explore"链接,进入如下页面: 页面上 ...

  5. apache https配置【转】

    博文来源:apache https配置 参考博文:apache.nginx配置自签名证书 1.  确认是否安装ssl模块 是否有mod_ssl.so文件 2.  生成证书和密钥 linux下 步骤1: ...

  6. topjui中combobox使用

    1.创建combobox的方法 常用的一种是通过Js定义,一种是通过在input输入框中定义,还有一种通过在selete标签中定义,可以去看easyui的官方文档 http://www.jeasyui ...

  7. 【字】biang

    biang biang面的名字由来:biangbiang面是陕西关中地区的一中地区美食,因为在做这种面时会发出biang biang的声音,biang biang面因此得名.biang字简体共有42笔 ...

  8. python之常用模块

    python 常用模块 之 (subprocess模块.logging模块.re模块) python 常用模块 之 (序列化模块.XML模块.configparse模块.hashlib模块) pyth ...

  9. 开放数据接口 API 简介与使用场景、调用方法

    此文章对开放数据接口 API 进行了功能介绍.使用场景介绍以及调用方法的说明,供用户在使用数据接口时参考之用. 在给大家分享的一系列软件开发视频课程中,以及在我们的社区微信群聊天中,都积极地鼓励大家开 ...

  10. MySQL数据类型的选择

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据类型的选择时间:2019年2月22日内容:MySQL数据类型的选择范式参考重点:主要讲述MyS ...