我们都知道电脑实际储存的是二进位资料,那是怎麽储存字元的呢?
可以想像的就是必须让字元映射成二进位资料(编码)进而储存。
因此我们必须制定哪些字元可以映射?映射的规则是什麽?
这就是字元集的功用。
我们先来看看几个重要知识点
Unicode统一码
由於我们所在的世界太大了,不同的地区订出不同的字元集,包含的字元及编码的规则都不一样,导致混乱,因此才有了Unicode通一码,它致力於解决这个问题,几乎包含了世界上所有语言的字元。最初希望透过16位元编码收录所有字元,但碍於要让所有软件符合16位元编码标准需耗费太大的成本,因此衍生出UTF-8(使用1-4个位元组来编码)、UTF-16(使用2或4个位元组来编码)、UTF-32(使用4个位元组来编码)三种字元集,相同的字元在三种字元集内皆为相同的编码,彼此兼容,此外也可兼容於ASCII字元集。
一个位元组就是xxxxxxxx,ex:10001111
ASCII字元集
总共收录128个字元,因此使用1个位元组即可编码,映射了控制字符(换行、换页、删除、退一格等)、通信字符(请求、收到通知、回应等)、大小写英文字母、标点符号和阿拉伯数字。以中文字‘我’来说就没有在ASCII里面。
UTF8MB3及UTF8MB4字元集
由於使用的字元集(不同的最大位元组长)会影响到系统储存与效能,MySQL工程师因此定义了UTF8MB3,它是阉割过的UTF-8字元集,只使用1-3个位元组来编码以提升效能,在MySQL中UTF-8指的就是UTF8MB3。
而UTF8MB4就是原先正宗的的UTF-8字元集。
(补充:在MySQL8.0中最佳化了UTF8MB4的性能,将其设为预设的字元集,在下面我查询本机MySQL字元集的时候可以看到)
再来相信大家一定对utf8_general_ci不陌生
那它到底是什麽东西呢?
它其实是一种校对规则,分成3个部分来看。
可以透过以下指令查询目前服务器使用什麽样的字元集和校对规则。
mysql> show variables like 'character_set_server';
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| character_set_server | utf8mb4 |
+----------------------+---------+
1 row in set (0.15 sec)
mysql> show variables like 'collation_server';
+------------------+--------------------+
| Variable_name | Value |
+------------------+--------------------+
| collation_server | utf8mb4_0900_ai_ci |
+------------------+--------------------+
1 row in set (0.02 sec)
这边可以发现MySQL8.0预设已使用UTF8MB4字元集
校对规则出现了0900,它是符合Unicode9.0规范的意思(Unicode规范也是不断地在更新的)。
最後补充说明字元集与校对规则的阶层与套用顺序。
MySQL的阶层为 服务器 => 资料库 => 表 => 列(栏位)
服务器有自己的字元集与校对规则
资料库也有自己的字元集与校对规则
表也有自己的字元集与校对规则
列(各个栏位)也有自己的字元集与校对规则
在创建资料库时不指定字元集与校对规则,预设就是照服务器的设定。
在创建表时不指定字元集与校对规则,预设就是照资料库的设定。
在创建栏位时不指定字元集与校对规则,预设就是表的设定。
今日篇幅虽短但每个知识点都非常重要唷!
Take a break ~ 明日再战
<<: D4- 如何透过 Google Apps Script 来整合 Google Form / Google Sheet 并自动寄出客制的 Email?
前言 上一篇我们讨论DDD的战术设计,它建议引用各种设计模式,提高生产力,因此接下来,就来介绍各种设...
D15. 字元阵列(2) 前一篇有讲到字元的输出是printf("%c",a[i...
再来就是实际建立透过 select 选择的脚位,并建立相关 Firmata 功能。 (过程和建立 w...
前言 昨天的文章介绍了 Deployment 以及 ReplicaSet 的基本介绍後,接下来要介绍...
今天要讲解的是 Select 组件,官网文件连结在这里。 Select 其实跟原生 html 里的 ...