十八、MySQL基础系列笔记之字符串
为什么需要字符集
由于计算机只能识别二进制代码,为了使计算能够处理文字信息,人们想出了给每个文字符号编号,便于计算机识别处理,这是计算机字符集的由来。
什么是字符集
一句话简述,字符集就是事与一套文字符号及其编码、比较规则的集合。
ASCII(American Standard Code for Information Interchange)国际标准ISO-646,采用7位编码,定义了包括大小写英文字母、阿拉伯数字、标点符号以及控制符号等。
字符集非常多,如被大家所熟悉的ISO-8859系列、GB2312-80、GBK等。
Unicode
由于字符串太多,为计算机软件开发和移植带来了很大的困难,为了统一字符编码,国际化标准组织(International Organization for Standardization,ISO)发起定制国际字符集标准,用于容纳全世界各种语言文字和符号。
噼里啪啦的这中间过程就是互撕的过程,然后达成一个共识。
常用字符集比较
MySQL支持的字符集
MySQL支持几十种字符集,如UTF-8、UTF-32、UTF-16等Unicode字符集。在同一台服务器、同一个数据库甚至同一个表的不同字段都可以指定使用不同的字符集。
查看所有可能用的字符集
<span style="box-sizing: border-box;padding-right: 0.1px">mysql> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">show</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">character</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">set</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">+----------+---------------------------------+---------------------+--------+</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">| <span style="box-sizing: border-box;color: rgb(255, 85, 0)">Charset</span> | Description | <span style="box-sizing: border-box;color: rgb(119, 0, 136)">Default</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">collation</span> | Maxlen |</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">+----------+---------------------------------+---------------------+--------+</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">| armscii8 | ARMSCII-<span style="box-sizing: border-box;color: rgb(17, 102, 68)">8</span> Armenian | armscii8_general_ci | <span style="box-sizing: border-box;color: rgb(17, 102, 68)">1</span> |</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">| ascii | US ASCII | ascii_general_ci | <span style="box-sizing: border-box;color: rgb(17, 102, 68)">1</span> |</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">......</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">| utf16 | UTF-<span style="box-sizing: border-box;color: rgb(17, 102, 68)">16</span> Unicode | utf16_general_ci | <span style="box-sizing: border-box;color: rgb(17, 102, 68)">4</span> |</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">| utf16le | UTF-<span style="box-sizing: border-box;color: rgb(17, 102, 68)">16</span>LE Unicode | utf16le_general_ci | <span style="box-sizing: border-box;color: rgb(17, 102, 68)">4</span> |</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">| utf32 | UTF-<span style="box-sizing: border-box;color: rgb(17, 102, 68)">32</span> Unicode | utf32_general_ci | <span style="box-sizing: border-box;color: rgb(17, 102, 68)">4</span> |</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">| utf8 | UTF-<span style="box-sizing: border-box;color: rgb(17, 102, 68)">8</span> Unicode | utf8_general_ci | <span style="box-sizing: border-box;color: rgb(17, 102, 68)">3</span> |</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">| utf8mb4 | UTF-<span style="box-sizing: border-box;color: rgb(17, 102, 68)">8</span> Unicode | utf8mb4_0900_ai_ci | <span style="box-sizing: border-box;color: rgb(17, 102, 68)">4</span> |</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">+----------+---------------------------------+---------------------+--------+</span>
查看字符串校对规则
mysql> show collation like 'utf8%';
MySQL字符集包括字符集(character)和排序规则(collation)两个概念。字符集用来定义MySQL存储字符串的方式,排序规则用来定义比较字符串的方式。字符集和排序规则是一对多关系。
排序规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名,且以ci(大小写不敏感)、cs(大小写敏感)、_bin(二元)结束。如:utf8_general_ci默认排序规则,不区分大小写;utf8_bin按照编码值排序,区分大小写。
设置MySQL字符集
MySQL字符集和排序规则有四个级别的默认设置:服务器级、数据库级、表级、字段级。
服务器字符集和排序规则
方式一:my.cnf中设置
<span style="box-sizing: border-box;padding-right: 0.1px">[mysqld]</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">character</span>-<span style="box-sizing: border-box;color: rgb(119, 0, 136)">set</span>-<span style="box-sizing: border-box;color: rgb(119, 0, 136)">server</span>=utf8</span>
方式二:启动选项中指定
mysqld --character-set-server=utf8
方式三:编译时指定
cmake . -DDEFAULT_CHARSET=utf8
查询当前服务器的字符集
<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)"># 服务器当前字符集</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">mysql> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">show</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">variables</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">like</span> <span style="box-sizing: border-box;color: rgb(34, 162, 201)">'character_set_server'</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">+----------------------+-------+</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">| Variable_name | <span style="box-sizing: border-box;color: rgb(119, 0, 136)">Value</span> |</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">+----------------------+-------+</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">| character_set_server | utf8 |</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">+----------------------+-------+</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(17, 102, 68)">1</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">row</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">in</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">set</span>, <span style="box-sizing: border-box;color: rgb(17, 102, 68)">1</span> warning (<span style="box-sizing: border-box;color: rgb(17, 102, 68)">0.00</span> sec)</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">mysql> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">show</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">variables</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">like</span> <span style="box-sizing: border-box;color: rgb(34, 162, 201)">'collation_server'</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">+------------------+-----------------+</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">| Variable_name | <span style="box-sizing: border-box;color: rgb(119, 0, 136)">Value</span> |</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">+------------------+-----------------+</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">| collation_server | utf8_unicode_ci |</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">+------------------+-----------------+</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(17, 102, 68)">1</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">row</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">in</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">set</span>, <span style="box-sizing: border-box;color: rgb(17, 102, 68)">1</span> warning (<span style="box-sizing: border-box;color: rgb(17, 102, 68)">0.00</span> sec)</span>
数据库字符集和排序规则
数据库的字符集和排序规则既可以在创建数据库时指定,也可以在创建完数据库后通过alter database
命令进行修改。
注意:如数据库中有数据,则不能将已有的数据按照新的字符串进行存放,因此不能通过修改数据库的字符串直接修改数据的内容。
设置字符串的规则如下:
- 若指定字符集和排序规则,则使用指定的字符集和排序规则;
- 若指定字符集没有指定排序规则,则使用指定字符集默认的排序规则;
- 若指定排序规则没有指定字符集,则字符集使用与排序规则相关联的字符集;
- 若没有指定字符集和排序规则,则使用服务器字符集和排序规则。
表字符集和排序规则
表的字符集和排序在创建表时指定,可以通过alter table
命令进行修改。
列字符集和排序规则
MySQL可以定义列级别的字符集和排序规则,主要是针对相同的表不同字段需要使用不同的字符集的情况。
列字符集和排序规则的定义可以在创建表时指定,或在修改表时调整。
字符集的修改
<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">alter</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">database</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">character</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">set</span> ***</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)"># 或</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">alter</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">table</span> 表名 <span style="box-sizing: border-box;color: rgb(119, 0, 136)">character</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">set</span> ***</span>
我是小白,期待和优秀的你一起同行!
小白
2020年10月22日