mysql字符集与校对规则---大小写敏感那点事

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

    在关系型数据库中,oracle/sql_server/db2都有对数据进行区分大小写,不过mysql有点奇怪,对数据不区分大小写,详细情况请看下面解析.

    MySQL在Linux下数据库名、表名、列名、别名大小写的默认规则是这样的:

        1.数据库名与表名是严格区分大小写的.

        2.表的别名是严格区分大小写的. 

        3.列名与列的别名在所有的情况下均是忽略大小写的.

        4.字段内容(即数据)默认情况下是大小写不敏感的.

        5.变量名(函数和存储过程)也是严格区分大小写的.

    所以不禁我们就会想去修改,而控制这些的究竟又是什么呢?正是字符集和字符集的校对规则限制的.


字符集和校对规则是什么

    字符集是我们字符解析的编码表,在计算机底层里,任何字符都只是无法直接解析的代码,需要这些编码表来解析究竟是什么字.最基础的正是ASCII码表,但是这个表字符太少,用来代表英文和一些日常标点符号就还好,但是要来代表全世界那么多的文字,就显然不够用了,所以就出了各种字符集来解析各种文字,例如中文简体的gb2312,中文繁体的big5,最出名的万国码utf8,还有支持emoji表情的utf8mb4等.

    我们常说的访问乱码,正是由于字符编码不对称导致的,可能是你和服务器之间,也可能是服务器与数据库之间,也可能是代码内部之间没有转换,等等.

    字符集是通用的,存在于计算机世界的各种环境,数据库只是其中之一,而校对规则,是针对mysql来说的,规则也都是固定的.可能有人会觉得懵逼,有了字符集,为什么还要校对规则,通俗易懂点说,字符之间有差异,但是靠什么去体现差异呢(例如排序和分组的操作),那就是这个校对规则的存在意义.例如:不区分大小写的话,A和a是同样意义的,而校对规则严格之后,区分了大小写,A和a就不一样了.


字符集

    我们可以用下面的命令来看看支持哪些字符集和校对规则.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#查看支持哪些字符集,节选
mysql> show character  set ;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset           | binary              |      1 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
+----------+---------------------------------+---------------------+--------+
41 rows  in  set  (0.01 sec)

    一般来说,mysql默认还是支持较多字符集,然而大部分情况我们还是用utf8比较多一些.原因是看到最后一列Maxlen中,代表的是使用这种字符集后的一个字符占用的最大字节数.big5(中文繁体)和gb2312(中文简体)虽然占的少,只有2字节,但是通用性不佳,utf16虽然很强大,但是占的字节数略多,占用了4字节,况且也不见得用得了那么多,折衷之下还是utf8好用一些,一个字符占用3字节.

    更改mysql的默认字符集,可以在配置文件my.cnf里添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#要在[mysqld]子项添加
[mysqld]
#全局默认字符集类型,按需求设定
character- set -server = utf8
#改完之后重启,进入mysql看一下,(不重启也行,一个个慢慢改吧)
mysql> show variables like  'character%' ;
+--------------------------+---------------------------------------------------------------+
| Variable_name            | Value                                                         |
+--------------------------+---------------------------------------------------------------+
| character_set_client     | utf8                                                          |
| character_set_connection | utf8                                                          |
| character_set_database   | utf8                                                          |
| character_set_filesystem | binary                                                        |
| character_set_results    | utf8                                                          |
| character_set_server     | utf8                                                          |
| character_set_system     | utf8                                                          |
| character_sets_dir       |  /usr/local/mysql-5 .7.18-linux-glibc2.5-x86_64 /share/charsets/  |
+--------------------------+---------------------------------------------------------------+
8 rows  in  set  (0.00 sec)


字符校对规则

    说完字符集,就来看看字符的校对规则有哪些.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#显示utf8字符集下有哪些校对规则,节选
mysql> SHOW COLLATION like  'utf8\_%' ;
+--------------------------+---------+-----+---------+----------+---------+
| Collation                | Charset | Id  | Default | Compiled | Sortlen |
+--------------------------+---------+-----+---------+----------+---------+
| utf8_general_ci          | utf8    |  33 | Yes     | Yes      |       1 |
| utf8_bin                 | utf8    |  83 |         | Yes      |       1 |
| utf8_unicode_ci          | utf8    | 192 |         | Yes      |       8 |
| utf8_icelandic_ci        | utf8    | 193 |         | Yes      |       8 |
| utf8_unicode_520_ci      | utf8    | 214 |         | Yes      |       8 |
| utf8_vietnamese_ci       | utf8    | 215 |         | Yes      |       8 |
| utf8_general_mysql500_ci | utf8    | 223 |         | Yes      |       1 |
+--------------------------+---------+-----+---------+----------+---------+
27 rows  in  set  (0.00 sec)

    校对规则有很多,但是大部分我们用不到,大家也看到其他规则很多sortlen是8,比前两个比较常用的都多,会比较费资源是肯定的.

    每个字符集有一个默认校对规则,例如,utf8默认校对规则是utf8_general_ci.并存在校对规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感),_cs(大小写敏感)或_bin(二元/大小写也敏感)结束。
    所以说,mysql的utf8字符集就默认对数据的大小写不敏感了.

    更改mysql的默认字符校对规则,也可以在配置文件my.cnf里添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#要在[mysqld]子项添加
[mysqld]
#全局默认字符校对规则,按需求设定
collation_server = utf8_bin
#改完之后重启,进入mysql看一下,(不重启也行,一个个慢慢改吧)
mysql> show variables like  'collation_%' ;
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_bin        |
| collation_server     | utf8_bin        |
+----------------------+-----------------+
3 rows  in  set  (0.00 sec)
#当然你也可以视实际情况只改库级别或链接级别,是允许不一样的,不过你要知道其中风险就是了
collation_database = utf8_bin
#需要特别额外说明的是,连接级别的字符校对规则,是由客户端决定的,靠更改配置文件是不生效的,
#所以要想更改,只能通过命令方式执行
mysql>  set  collation_connection = utf8_bin


注意

    要注意的是,这些更改都只对后续创建的数据库表和用户生效,已经存在的数据库是不受影响的,想要更改现有表的定义,那就必须更改表结构,或者重建数据库.

    更改的方法就是alter,创建的方法如果是默认就不需要干什么,如果不默认就要人为指定了.

1
2
#更改表的字符集和字符校对规则
mysql> ALTER TABLE 表名 MODIFY COLUMN 字段名 varchar(50) CHARACTER SET utf8 COLLATE utf8_bin;

    需要特别注意的是,对已有数据库的表更改字符校对规则并不影响表的使用,只要表的数据不存在冲突就可以,只是部分查询和排序/分组的操作会造成差距,但是字符集乱改的话,会直接造成数据乱码,所以要非常谨慎,有时候还不如重建数据库比较实际.

    当然,假如你确实有需要,你也可以指定库和表用什么字符编码和校对规则,例如突然要做一个指定是utf8mb4的库或表.

1
2
3
4
5
6
7
8
9
#创建数据库时指定字符编码和校对规则,以后在这个库新建的表的字段默认都遵循这两个规则
mysql> CREATE DATABASE 数据库名 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
#创建一个表,指定使用字符集和校对规则,其他表不指定则走数据库的默认配置
mysql> CREATE TABLE 表名(字段名 varchar(5)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
#创建一个表,指定不同字段有不同的字符集和校对规则,其他不指定则走数据库的默认配置
CREATE TABLE `表名` (
`字段1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`字段2`  varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL 
);

    开头也列出了,mysql默认数据库名与表名是严格区分大小写的,如果仅是对数据库名与表名大小写敏感进行修改,则my.cnf有一个专门的配置选项,直接配置完成后,重启就会忽略数据库名与表名的大小写规则,两个一起生效,lower_case_table_names

1
2
3
4
5
#要在[mysqld]子项添加
[mysqld]
#表名的大小写敏感选项,0为大小写敏感,1为大小写不敏感
lower_case_table_names = 1
#重启生效








     本文转自arthur376 51CTO博客,原文链接:http://blog.51cto.com/arthur376/1927162 ,如需转载请自行联系原作者


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL 存储
【MySQL】——数据类型及字符集
【MySQL】——数据类型及字符集
165 0
【MySQL】——数据类型及字符集
|
1月前
|
存储 人工智能 搜索推荐
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。
|
1月前
|
存储 人工智能 关系型数据库
详细介绍TiDB 与 MySQL 中的常用字符集及排序规则
一文理清 TiDB 与 MySQL 中的常用字符集及排序规则
119 6
|
1月前
|
弹性计算 安全 关系型数据库
rds安全组规则
云数据库RDS的安全组规则是虚拟防火墙,用于控制网络访问权限,确保数据库安全。配置要点包括:指定RDS实例的安全组,设定入方向规则(如源IP、协议和端口),考虑默认规则的开放程度。根据场景,同组内外的ECS实例需不同配置。管理员应合理规划规则,确保业务需求与安全性平衡,并定期审计更新。
20 3
|
1月前
|
SQL 关系型数据库 MySQL
[MySQL]SQL优化之索引的使用规则
[MySQL]SQL优化之索引的使用规则
|
2月前
|
存储 关系型数据库 MySQL
【2024】新建mysql数据库,如何选择字符集和排序规则
【2024】新建mysql数据库,如何选择字符集和排序规则
155 1
|
15天前
|
关系型数据库 MySQL 数据库
mysql卸载、下载、安装(window版本)
mysql卸载、下载、安装(window版本)
|
1月前
|
关系型数据库 MySQL 数据库连接
关于MySQL-ODBC的zip包安装方法
关于MySQL-ODBC的zip包安装方法
|
1月前
|
关系型数据库 MySQL 数据库
rds安装数据库客户端工具
安装阿里云RDS的数据库客户端涉及在本地安装对应类型(如MySQL、PostgreSQL)的客户端工具。对于MySQL,可选择MySQL Command-Line Client或图形化工具如Navicat,安装后输入RDS实例的连接参数进行连接。对于PostgreSQL,可以使用`psql`命令行工具或图形化客户端如PgAdmin。首先从阿里云控制台获取连接信息,然后按照官方文档安装客户端,最后配置客户端连接以确保遵循安全指引。
85 1
|
4天前
|
关系型数据库 MySQL 数据库
《MySQL 简易速速上手小册》第1章:MySQL 基础和安装(2024 最新版)
《MySQL 简易速速上手小册》第1章:MySQL 基础和安装(2024 最新版)
28 4