自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

漫話:如何給女朋友解釋為什么不能在MySQL中使用UTF-8編碼

數(shù)據(jù)庫(kù) MySQL
據(jù)庫(kù),這個(gè)大家肯定都不陌生,使用MySQL創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候,大家需要指定一種編碼方式。很多時(shí)候,大家基于自己對(duì)編碼方式的了解,會(huì)認(rèn)為UTF-8是一種通用的編碼方式,所以大多數(shù)時(shí)候會(huì)默認(rèn)選擇這種編碼方式。

[[398602]]

MySQL是一種關(guān)系型數(shù)

據(jù)庫(kù),這個(gè)大家肯定都不陌生,使用MySQL創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候,大家需要指定一種編碼方式。

很多時(shí)候,大家基于自己對(duì)編碼方式的了解,會(huì)認(rèn)為UTF-8是一種通用的編碼方式,所以大多數(shù)時(shí)候會(huì)默認(rèn)選擇這種編碼方式。

但是,這往往會(huì)給你的數(shù)據(jù)庫(kù)埋下一個(gè)大坑!!!

MySQL對(duì)Unicode的支持

Unicode字符集,他現(xiàn)在已經(jīng)是計(jì)算機(jī)科學(xué)領(lǐng)域里的一項(xiàng)業(yè)界標(biāo)準(zhǔn),它對(duì)世界上大部分的文字系統(tǒng)進(jìn)行了整理、編碼,使得計(jì)算機(jī)可以用更為簡(jiǎn)單的方式來(lái)呈現(xiàn)和處理文字。

為了適應(yīng)不同的數(shù)據(jù)存儲(chǔ)和傳遞需求,人們提出了 Unicode Transformation Format(UTF)系列編碼。這其中包含UTF-8、UTF-16、UTF-32等。

通過查閱MySQL官方文檔(https://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html ),我們可以知道,在MySQL中,主要支持以下字符集:utf8、ucs2、utf8mb3、utf8mb4、utf16、utf16le和utf32

不同的字符集的區(qū)別在于包含的字符情況以及存儲(chǔ)需要的空間。

字符集 支持的字符 每個(gè)字符所需存儲(chǔ)空間
utf8mb3, utf8 BMP 1-3 字節(jié)
ucs2 BMP 2 字節(jié)
utf8mb4 BMP和補(bǔ)充字符 1-4 字節(jié)
utf16 BMP和補(bǔ)充字符 2或4 字節(jié)
utf16le BMP和補(bǔ)充字符 2或4 字節(jié)
utf32 BMP和補(bǔ)充字符 4 字節(jié)

在MySQL官方文檔中,介紹了支持的編碼方式之后,還有一段醒目的提醒:

翻譯過來(lái)是:utf8mb3字符集已被棄用,它在未來(lái)的MySQL版本中將會(huì)被刪除,請(qǐng)使用utf8mb4代替。在目前的8.0版本中,utf8指的就是utf8mb3,雖然未來(lái)可能改成utf8mb4,但是為了避免產(chǎn)生歧義,可以考慮為字符集引用顯式指定utf8mb4,而不是utf8。

也就是說,當(dāng)我們?cè)贛ySQL 8.0 中指定字符編碼方式為UTF-8的時(shí)候,其實(shí)使用的是utf8mb3這種編碼方式。

那么,我們先來(lái)說說utf8mb3。

utf8mb3

utf8mb3字符集是MySQL早期就支持的字符集,他具有以下特征:

1、僅支持BMP字符(不支持補(bǔ)充字符)

2、每個(gè)多字節(jié)字符最多需要三個(gè)字節(jié)

注意,僅支持BMP字符,那么什么是BMP字符呢?

BMP是Basic Multilingual Plane的縮寫,即碼位在0到65535之間(或者U+0000和U+FFFF)的字符。

BMP中并不包含補(bǔ)充字符,即碼位在U+10000和U+10FFFF之間的的字符。補(bǔ)充字符有哪些呢,如一些生僻的漢字,或者Emoji 表情等都是補(bǔ)充字符。

也就是說,如果在建表的時(shí)候,指定的編碼方式是utf8mb3(utf-8),那么對(duì)于一些生僻字或者emoji表情都無(wú)法表示。

utf8mb4

早期的時(shí)候,Unicode 只用到了 0~0xFFFF 范圍的數(shù)字編碼,這就是 BMP 字符集。所以,最初MySQL在設(shè)計(jì)之初,也就只涉及了包含BMP 字符集的utfmb3(utf-8),但是隨著文字越來(lái)越多,3個(gè)字節(jié)肯定無(wú)法全部表示,于是Unicode支持的字符就更多了。

所以,早期的utfmb3在有些場(chǎng)景中就不能滿足需求了,于是,MySQL在5.5.3之后增加了utf8mb4的編碼。

utfmb4字符集具有以下特征:

1、支持BMP和補(bǔ)充字符。

2、每個(gè)多字節(jié)字符最多需要4個(gè)字節(jié)。

utf8mb4與utf8mb3字符集不同,utf8mb3字符集只支持BMP字符,每個(gè)字符最多使用三個(gè)字節(jié):

對(duì)于BMP字符,utf8mb4和utf8mb3具有相同的存儲(chǔ)特征,即相同的編碼值,相同的編碼,相同的長(zhǎng)度。

對(duì)于補(bǔ)充字符,utf8mb4需要4個(gè)字節(jié)來(lái)存儲(chǔ)它,而utf8mb3根本不能存儲(chǔ)該字符。所以我們說utf8mb4是utf8mb3的超集。

所以,很多時(shí)候,為了考慮到兼容性,建議創(chuàng)建MySQL表的時(shí)候,使用utf8mb4,而不是utf8!

utf8mb3和utf8mb4區(qū)別及優(yōu)缺點(diǎn)

前面分別介紹了utf8mb3和utf8mb4字符集,他們的區(qū)別如下:

utf8mb3只支持BMP (Basic Multilingual Plane)的字符。utf8mb4還支持BMP之外的補(bǔ)充字符。

utf8mb3每個(gè)字符最多使用3個(gè)字節(jié)。Utf8mb4每個(gè)字符最多使用4個(gè)字節(jié)。

utf8mb4比utf8mb3來(lái)說,他能表示更多的補(bǔ)充字符,但是同時(shí)占用的空間可能會(huì)更大一些。

從utf8mb3轉(zhuǎn)換成utf8mb4

首先,想要把字符集從utf8mb3轉(zhuǎn)換到utf8mb4,其實(shí)是問題不大的:

對(duì)于BMP字符,utf8mb4和utf8mb3具有相同的存儲(chǔ)特征:相同的編碼值,相同的編碼,相同的長(zhǎng)度。

對(duì)于補(bǔ)充字符,utf8mb4需要4個(gè)字節(jié)來(lái)存儲(chǔ)它,而utf8mb3根本不能存儲(chǔ)該字符。當(dāng)將utf8mb3列轉(zhuǎn)換為utf8mb4時(shí),您不必?fù)?dān)心轉(zhuǎn)換補(bǔ)充字符,因?yàn)闆]有補(bǔ)充字符。

假設(shè)有一張已知表使用了utf8mb3:

  1. CREATE TABLE t1 ( 
  2.   col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
  3.   col2 CHAR(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL 
  4. CHARACTER SET utf8; 

下面的語(yǔ)句將t1轉(zhuǎn)換為utf8mb4:

  1. ALTER TABLE t1 
  2.   DEFAULT CHARACTER SET utf8mb4, 
  3.   MODIFY col1 CHAR(10) 
  4.     CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL
  5.   MODIFY col2 CHAR(10) 
  6.     CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL

關(guān)于作者:漫話編程,是一個(gè)通過漫畫+音頻的形式講解枯燥的編程知識(shí)的公眾號(hào)。致力于讓編程變得更有樂趣。

本文轉(zhuǎn)載自微信公眾號(hào)「漫話編程」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系漫話編程公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 漫話編程
相關(guān)推薦

2021-06-07 12:11:20

JavaRunning狀態(tài)

2021-03-02 06:03:30

Java繼承對(duì)象

2020-03-16 14:08:59

線程熔斷限流

2019-03-12 09:43:14

反向代理正向代理服務(wù)器

2021-09-14 12:00:11

VR字節(jié)跳動(dòng)

2019-10-09 10:45:16

云計(jì)算Web互聯(lián)網(wǎng)

2019-12-23 10:26:02

3PC分布式2PC

2019-04-09 09:40:23

2020-10-19 13:01:31

刪庫(kù)程序員思科

2019-07-22 10:34:31

大案牘術(shù)大數(shù)據(jù)Big Data

2019-04-26 14:46:18

GitGitHub局域網(wǎng)

2020-10-12 13:27:21

計(jì)算機(jī)瀏覽器電腦

2021-04-26 14:00:43

Java 數(shù)據(jù)類型

2019-03-06 10:59:09

寬帶王者榮耀網(wǎng)絡(luò)

2019-04-19 09:48:53

樂觀鎖悲觀鎖數(shù)據(jù)庫(kù)

2020-12-28 12:37:36

緩存擊穿穿透

2020-03-23 12:57:20

撞庫(kù)脫庫(kù)洗庫(kù)

2019-08-13 10:34:26

鴻蒙OS跨平臺(tái)Linux內(nèi)核

2020-01-08 08:54:05

網(wǎng)站日期代碼

2019-04-15 14:05:56

MySQLUTF-8數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)