多语言展示
当前在线:1814今日阅读:27今日分享:41

MySQL学习--(1)彻底弄懂MySQL字符集(上)

MySQL是我们平时经常使用的一款开源数据库,虽然已经被Oracle收购,但开源本性目前依然保存,MariaDB是有先见之明的牛人基于MySQL创建的一个分支(以防Oracle“使坏”),和MySQL完全兼容,但本系列经验还是以原生MySQL为主。在使用MySQL时,很多人对其关连的字符集总是似懂非懂,模模糊糊,其实这也不难理解,MySQL中对各个场景(包括服务器、数据库、表、列、客户端、查询结果等)使用的字符集都可以自定义,非常灵活(同时也增加了学习和理解成本),这篇经验就让你彻底理一下这些概念!
工具/原料

一台安装了MySQL的电脑

方法/步骤
1

首先我们需要一台安装了MySQL数据库的电脑,因为和安装其他软件没有任何区别,这里就不给大家演示这个过程了,只是和大家强调一个版本相关的事情,目前大家最常听说的MySQL版本是5.6和5.7,但MySQL已经发布了最新版本是 8.0,本经验就是基于最新的 8.0 版本,不同版本之间一些参数的默认值可能略有不同,但整理而言,对于大部分知识点,应该不会有很大区别。

2

好了,打开命令行,先通过 mysql -uroot -p 命令(输入密码)登陆MySQL服务器,然后运行第一个与字符集相关的命令 show charset ,查看MySQL目前支持的字符集类型,图示,目前共支持41种字符集,其中列“Charset”就是该字符集名称,列“Default Collation”是该字符集默认的比较规则(这个后面会再说),列“MaxLen”表示该字符集表示单一字符的最长所需字节数(对于变长字符集比如gbk,utf8等,他们表示单一字符的字节个数可以有多种值)。我们这里还有说一点有意思的东西,对于基本成为通用字符集的 utf8,MySQL 有两种字符集与之对应,运行命令 show charset like 'utf8%' 我们可以看到,其返回两条字符集数据 utf8 和 utf8mb4 (图示),前者单字符最长3个字节,后者单字符最长4个字节,前者就是俗称的“阉割版”utf8,是MySQL开发工程人员为了节省存储空间而推出的字符集(MySQL行存储时,对于变长字符串varchar类型计算存储空间是按其使用字符集的最长字节数计算的,这个后面也会讲),后者单字符最长4个字节,就是我们标准版的utf8字符集。

3

继续我们的探索,运行命令 show variables like 'character_set_server' , 或者 select @@character_set_server , 这两个命令执行效果一样,都是查看系统变量 character_set_server 的值, 这个系统变量表示MySQL服务器默认使用的字符集,图示,MySQL8.0 服务器默认字符集是 utf8mb4, 即标准 utf8。那这个系统变量指定的字符集有什么用呢? 答案是很有用(好像废话)!其作用就是当我们通过 create database XXX 创建一个数据库时,如果没有为这个数据库指明特定的字符集,则会默认使用这个系统变量指定的字符集作为我们数据库的字符集。我们来实验一下,通过 create database firstDatabase 创建一个没有指明字符集的数据库,并通过 use firstDatabase 进入该数据库,执行命令 show variables like 'character_set_database' 或者 select @@character_set_database 看看这个数据库使用的字符集,图示,其默认就是使用的 utf8mb4 这个服务器默认的字符集。

4

和上一步进行一下对比,我们这次通过指定字符集创建一个数据库看看效果,运行命令 create database secondDatabase default charset utf8 我们这里指定使用“阉割版”的utf8字符集,然后运行命令 use secondDatabase 进入该数据库,运行命令 show variables like 'character_set_database' 确认该数据库使用的字符集 , 图示,这个数据库的字符集就是我们指定的 utf8, 而不是上面那个未指定字符集的数据库的默认的 utf8mb4 字符集。这里我们引入了另一个系统变量 character_set_database , 其代表一个特定数据库使用的字符集,因此如果想查询这个系统变量的值,必须在一个特定数据库下查询(先执行 use databaseName ),那这个系统变量有啥用呢?答案还是很有用(手动滑稽...)!  当我们在这个数据库下创建一个表时,如果没有为这个表指明一个特定的字符集,其默认就采用这个数据库的字符集作为自己默认的字符集!

5

好了,本篇经验先到此为止,后续还会继续通过经验为大家剖解MySQL字符集的那些事。

注意事项
1

可以通过 show variables like 'VariableName' 或者 select @@VariableName 来查看一个特定系统变量的值,前者可以通过 % 作为通配符进行模糊匹配,后者必须精准查询

2

character_set_database 必须在特定数据库下查看,否则查询的值没有意义

推荐信息