暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL每日答题记录

原创 Root__Liu 2023-05-28
265

MySQL建表语句中,设置表的默认字符集关键字是?      AB

A、DEFAULT CHARACTER SET

B、CHARACTER SET

C、DEFAULT CHARACTER

D、CHARACTER


一、字符集概述

字符集(Character Set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII、GB2312、BIG5、Unicode等。


UTF(Unicode Tranformation Format)是Unicode的其中一个使用方式,即把Unicode转做某种格式的意思,包括UTF-8,UTF-16,UTF-32。


UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。


UTF-8用1到6个字节编码Unicode字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。


UTF-16使用一个或两个未分配的16位代码单元的序列对Unicode代码点进行编码。


UTF-32即将每一个Unicode代码点表示为相同值的32位整数。


下面是UTF-8的编码方式:

一个字节:0xxxxxxx
复制



二、MySQL的字符集


MySQL的字符集包括字符集(charset)和校对规则(collation)两个概念。


字符集定义了存储字符串的方式,校对规则定义了比较字符串的方式。


MySQL8.0支持40多种字符集的270多种校对规则。


可以使用以下指令,来查看MySQL系统支持的字符集和校对规则。如下:

mysql> show charset;
复制


MySQL8.0之前创建表不指定字符集的话,默认采用latin1字符集,MySQL8.0之后版本才改为默认utf8mb4(most bytes 4)字符集,昆仑数据库存储节点采用的是MySQL8.0架构,当然也是默认utf8mb4。

UTF-8,在MySQL中写作utf8,真的有所不同。


MySQL从4.1版本开始支持utf8。可能当时的utf8还没有定义4-6个字节标准,或者MySQL设计者认为1-3个字节的utf8已经够用了。


所以当时MySQL设计的utf8只支持1-3个字节的编码,不是完整的utf8,这种编码方式一直保留至今。


虽然在MySQL在5.5.3之后增加了utf8mb4字符集,但一段时间开发人员都习惯采用utf8等字符集来支持中文。


MySQL的utf8会导致一些4个字节编码的生僻汉字插入错误。


还有现在APP端的emoji表情是4个字节的字符,如果不转码,直接更新到数据库也会报出异常。


历史原因导致MySQL的utf8经常让人误解,曾经让很多开发人员吃了苦头,网上有些文章比如:“永远不要在MySQL中使用utf8”,看着都挺吓人。


当然过个几年4个字节的utf8mb4编码可能又不够用了,那MySQL又要增加utf8mb5、utf8mb6。


字符除了需要存储,还需要排序或比较大小,涉及与字符集相对应的校对规则。在MySQL8.0中查看一下utf8mb4对应的校对规则:

mysql> show collationlike 'utf8mb4%';
+----------------------------+---------+-----+---------+
| Collation                  | Charset | Id  | Default |
+----------------------------+---------+-----+---------+
|utf8mb4_0900_ai_ci          | utf8mb4 |255 | Yes     |
|utf8mb4_0900_as_ci          | utf8mb4 |305 |         |
|utf8mb4_0900_as_cs          | utf8mb4 |278 |         |
|utf8mb4_0900_bin            | utf8mb4 |309 |         |
| utf8mb4_bin                | utf8mb4 | 46 |         |
| ...................        |         |    |         |
75 rows in set (0.00sec)
复制


utf8mb4的校对规则默认utf8mb4_0900_ai_ci。其中0900表示Unicode版本9.0.0,后缀含义如下表:

+-------------+----------------------+-----------------+
|   后缀       |          英文         |      描述       |
+-------------+----------------------+-----------------+
|   _ai       |  accent insensitive  |     不区分重音   |
|   _as       |   accent sensitive   |     区分重音     |
|   _ci       |   case insensitive   |    不区分大小写  |
|   _cs       |    case sensitive    |    区分大小写    |
|   _bin      |       binary         |    二进制比较    |
+-------------+----------------------+-----------------+
复制



三、举例来解释一下MySQL的utf8字符集


创建两张表,分别为utf8和utf8mb4字符集:

CREATE TABLE tb_utf8(
   `id` INT AUTO_INCREMENT,
   `info` VARCHAR(8),
   PRIMARY KEY (`id`))CHARSET=utf8;
CREATE TABLE tb_utf8mb4(
   `id` INT AUTO_INCREMENT,
   `info` VARCHAR(8),
   PRIMARY KEY (`id`)); #默认采用utf8mb4
复制


插入数据:

insert into tb_utf8(info) values("昆仑数据库");
insert into tb_utf8(info) values("昆仑数据库A12");
insert into tb_utf8(info) values("昆仑数据库A123");#超过8个字符失败了
复制


查看一下表格数据,以及占用空间:

mysql> selectinfo,length(info) from tb_utf8;
+--------------------+--------------+
| info               | length(info) |
+--------------------+--------------+
|   昆仑数据库         |           15 |
|   昆仑数据库A12      |           18 |
+--------------------+--------------+
2 rows in set (0.00sec)
复制

可以看出utf8字符集中,一般的汉字占用3个字节,英文和数字占1个字节。

接下来试下4个字节的emoji表情包:

插入4个字节的emoji表情包失败了。


因为大部分SSH工具不支持4字节的UTF-8字符显示,笔者是直接在Ubuntu20系统的Terminal做的演示。4字节的生僻汉字暂时找不到支持的终端界面,这里就不演示了。一、字符集概述

字符集(Character Set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII、GB2312、BIG5、Unicode等。


UTF(Unicode Tranformation Format)是Unicode的其中一个使用方式,即把Unicode转做某种格式的意思,包括UTF-8,UTF-16,UTF-32。


UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。


UTF-8用1到6个字节编码Unicode字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。


UTF-16使用一个或两个未分配的16位代码单元的序列对Unicode代码点进行编码。


UTF-32即将每一个Unicode代码点表示为相同值的32位整数。


下面是UTF-8的编码方式:

一个字节:0xxxxxxx
复制



二、MySQL的字符集


MySQL的字符集包括字符集(charset)和校对规则(collation)两个概念。


字符集定义了存储字符串的方式,校对规则定义了比较字符串的方式。


MySQL8.0支持40多种字符集的270多种校对规则。


可以使用以下指令,来查看MySQL系统支持的字符集和校对规则。如下:

mysql> show charset;
复制


MySQL8.0之前创建表不指定字符集的话,默认采用latin1字符集,MySQL8.0之后版本才改为默认utf8mb4(most bytes 4)字符集,昆仑数据库存储节点采用的是MySQL8.0架构,当然也是默认utf8mb4。

UTF-8,在MySQL中写作utf8,真的有所不同。


MySQL从4.1版本开始支持utf8。可能当时的utf8还没有定义4-6个字节标准,或者MySQL设计者认为1-3个字节的utf8已经够用了。


所以当时MySQL设计的utf8只支持1-3个字节的编码,不是完整的utf8,这种编码方式一直保留至今。


虽然在MySQL在5.5.3之后增加了utf8mb4字符集,但一段时间开发人员都习惯采用utf8等字符集来支持中文。


MySQL的utf8会导致一些4个字节编码的生僻汉字插入错误。


还有现在APP端的emoji表情是4个字节的字符,如果不转码,直接更新到数据库也会报出异常。


历史原因导致MySQL的utf8经常让人误解,曾经让很多开发人员吃了苦头,网上有些文章比如:“永远不要在MySQL中使用utf8”,看着都挺吓人。


当然过个几年4个字节的utf8mb4编码可能又不够用了,那MySQL又要增加utf8mb5、utf8mb6。


字符除了需要存储,还需要排序或比较大小,涉及与字符集相对应的校对规则。在MySQL8.0中查看一下utf8mb4对应的校对规则:

mysql> show collationlike 'utf8mb4%';
+----------------------------+---------+-----+---------+
| Collation                  | Charset | Id  | Default |
+----------------------------+---------+-----+---------+
|utf8mb4_0900_ai_ci          | utf8mb4 |255 | Yes     |
|utf8mb4_0900_as_ci          | utf8mb4 |305 |         |
|utf8mb4_0900_as_cs          | utf8mb4 |278 |         |
|utf8mb4_0900_bin            | utf8mb4 |309 |         |
| utf8mb4_bin                | utf8mb4 | 46 |         |
| ...................        |         |    |         |
75 rows in set (0.00sec)
复制


utf8mb4的校对规则默认utf8mb4_0900_ai_ci。其中0900表示Unicode版本9.0.0,后缀含义如下表:

+-------------+----------------------+-----------------+
|   后缀       |          英文         |      描述       |
+-------------+----------------------+-----------------+
|   _ai       |  accent insensitive  |     不区分重音   |
|   _as       |   accent sensitive   |     区分重音     |
|   _ci       |   case insensitive   |    不区分大小写  |
|   _cs       |    case sensitive    |    区分大小写    |
|   _bin      |       binary         |    二进制比较    |
+-------------+----------------------+-----------------+
复制



三、举例来解释一下MySQL的utf8字符集


创建两张表,分别为utf8和utf8mb4字符集:

CREATE TABLE tb_utf8(
   `id` INT AUTO_INCREMENT,
   `info` VARCHAR(8),
   PRIMARY KEY (`id`))CHARSET=utf8;
CREATE TABLE tb_utf8mb4(
   `id` INT AUTO_INCREMENT,
   `info` VARCHAR(8),
   PRIMARY KEY (`id`)); #默认采用utf8mb4
复制


插入数据:

insert into tb_utf8(info) values("昆仑数据库");
insert into tb_utf8(info) values("昆仑数据库A12");
insert into tb_utf8(info) values("昆仑数据库A123");#超过8个字符失败了
复制


查看一下表格数据,以及占用空间:

mysql> selectinfo,length(info) from tb_utf8;
+--------------------+--------------+
| info               | length(info) |
+--------------------+--------------+
|   昆仑数据库         |           15 |
|   昆仑数据库A12      |           18 |
+--------------------+--------------+
2 rows in set (0.00sec)
复制

可以看出utf8字符集中,一般的汉字占用3个字节,英文和数字占1个字节。

接下来试下4个字节的emoji表情包:

插入4个字节的emoji表情包失败了。


因为大部分SSH工具不支持4字节的UTF-8字符显示,笔者是直接在Ubuntu20系统的Terminal做的演示。4字节的生僻汉字暂时找不到支持的终端界面,这里就不演示了。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论