MySQL学习--(1)彻底弄懂MySQL字符集(上)
1、首先我们需要一台安装了MySQL数据库的电脑,因为和安装其他软件没有任何区别,这里就不给大家演示这个过程了,只是和大家强调一个版本相关的事情,目前大家最常听说的MySQL版本是5.6和5.7,但MySQL已经发布了最新版本是 8.0,本经验就是基于最新的 8.0 版本,不同版本之间一些参数的默认值可能略有不同,但整理而言,对于大部分知识点,应该不会有很大区别。
2、好了,打开命令行,先通过 m鲻戟缒男ysql -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字符集的那些事。