既熟悉又陌生的字元集与比较规则

我们都知道电脑实际储存的是二进位资料,那是怎麽储存字元的呢?
可以想像的就是必须让字元映射成二进位资料(编码)进而储存。
因此我们必须制定哪些字元可以映射?映射的规则是什麽?
这就是字元集的功用。

我们先来看看几个重要知识点

  • 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个部分来看。

  1. utf8,字元集的意思
  2. general,通用语言 ex : utf8_spanish_ci 表示西半牙语、utf8_polish_ci 表示波兰语
  3. ci,尾码,表示规则是否区分语言中的重音、大小写等 ex : utf8_general_as(accent sensitive区分重音)、utf8_general_ci(case insensitive不区分大小写)、utf8_general_bin(binary以二进位方式校对)

可以透过以下指令查询目前服务器使用什麽样的字元集和校对规则。

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?

>>:  全端入门Day04_何谓全端之前端终篇

【Day 08】工厂方法设计模式(Python)

前言 上一篇我们讨论DDD的战术设计,它建议引用各种设计模式,提高生产力,因此接下来,就来介绍各种设...

D15. 学习基础C、C++语言

D15. 字元阵列(2) 前一篇有讲到字元的输出是printf("%c",a[i...

D15 - 「类比×电压×输入」:建立控制组件

再来就是实际建立透过 select 选择的脚位,并建立相关 Firmata 功能。 (过程和建立 w...

Day14-Kubernetes 那些事 - Deployment 与 ReplicaSet(二)

前言 昨天的文章介绍了 Deployment 以及 ReplicaSet 的基本介绍後,接下来要介绍...

Material UI in React [ Day12 ] Inputs (Select) 选择框

今天要讲解的是 Select 组件,官网文件连结在这里。 Select 其实跟原生 html 里的 ...