您好,登錄后才能下訂單哦!
小編這次要給大家分享的是淺談MySQL編碼utf8與utf8mb4 utf8mb4_unicode_ci與utf8mb4_general_ci,文章內(nèi)容豐富,感興趣的小伙伴可以來(lái)了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
參考:mysql字符集小結(jié)
utf8mb4 已成為 MySQL 8.0 的默認(rèn)字符集,在MySQL 8.0.1及更高版本中將 utf8mb4_0900_ai_ci 作為默認(rèn)排序規(guī)則。
新項(xiàng)目只考慮 utf8mb4
UTF-8 編碼是一種變長(zhǎng)的編碼機(jī)制,可以用1~4個(gè)字節(jié)存儲(chǔ)字符。
因?yàn)闅v史遺留問(wèn)題,MySQL 中的 utf8 編碼并不是真正的 UTF-8,而是閹割版的,最長(zhǎng)只有3個(gè)字節(jié)。當(dāng)遇到占4個(gè)字節(jié)的 UTF-8 編碼,例如 emoji 字符或者復(fù)雜的漢字,會(huì)導(dǎo)致存儲(chǔ)異常。
從 5.5.3 開始,MySQL 開始用 utf8mb4 編碼來(lái)實(shí)現(xiàn)完整的 UTF-8,其中 mb4 表示 most bytes 4,最多占用4個(gè)字節(jié)。從 8.0 之后,將會(huì)在某個(gè)版本開始用 utf8mb4 作為默認(rèn)字符編碼。
設(shè)置服務(wù)器默認(rèn)字符集為 utf8mb4
創(chuàng)建數(shù)據(jù)庫(kù)時(shí),如果沒(méi)有指定字符集,會(huì)采用服務(wù)器的默認(rèn)字符集。設(shè)置服務(wù)器默認(rèn)字符集為 utf8mb4 可以提高便利性。
編輯 MySQL 的配置文件
只需要關(guān)心5個(gè)系統(tǒng)變量,這5個(gè)都改為 utf8mb4 則修改成功:
character_set_client
character_set_connection
character_set_results
character_set_server
character_set_database
my.cnf
是MySQL 的配置文件,修改之前記得先備份:
vi /etc/my.cnf
在[mysqld]下面加上default-character-set=utf8后服務(wù)器啟動(dòng)不了,莫名其妙。后來(lái)這么改就好了(MySQL5.7):
[mysqld] init_connect='SET collation_connection = utf8mb4_unicode_ci' init_connect='SET NAMES utf8mb4' character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci skip-character-set-client-handshake ... [client] default-character-set=utf8mb4
MySQL8.0 默認(rèn)已經(jīng)是 utf8mb4,不用改懂。如果你要改的話,配置文件如下:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid character-set-server = utf8mb4 [client] default-character-set=utf8mb4
重啟并確認(rèn)
可以看到,系統(tǒng)編碼、連接編碼、服務(wù)器和客戶端編碼都設(shè)置為 UTF-8了:
mysql> show variables like "%char%"; +--------------------------------------+--------------------------------+ | Variable_name | Value | +--------------------------------------+--------------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql-8.0/charsets/ | | validate_password.special_char_count | 1 | +--------------------------------------+--------------------------------+ 9 rows in set (0.00 sec)
MySQL 中字符集相關(guān)變量
character_set_client:客戶端請(qǐng)求數(shù)據(jù)的字符集
character_set_connection:從客戶端接收到數(shù)據(jù),然后傳輸?shù)淖址?br/>character_set_database:默認(rèn)數(shù)據(jù)庫(kù)的字符集,無(wú)論默認(rèn)數(shù)據(jù)庫(kù)如何改變,都是這個(gè)字符集;如果沒(méi)有默認(rèn)數(shù)據(jù)庫(kù),那就使用 character_set_server指定的字符集,這個(gè)變量建議由系統(tǒng)自己管理,不要人為定義。
character_set_filesystem:把操作系統(tǒng)上的文件名轉(zhuǎn)化成此字符集,即把 character_set_client轉(zhuǎn)換character_set_filesystem, 默認(rèn)binary是不做任何轉(zhuǎn)換的
character_set_results:結(jié)果集的字符集
character_set_server:數(shù)據(jù)庫(kù)服務(wù)器的默認(rèn)字符集
character_set_system:存儲(chǔ)系統(tǒng)元數(shù)據(jù)的字符集,總是 utf8,不需要設(shè)置
創(chuàng)建數(shù)據(jù)庫(kù)時(shí)指定字符集為 utf8mb4
如果數(shù)據(jù)庫(kù)默認(rèn)字符集不是 utf8mb4,那么可以在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)指定字符集:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
排序字符集 collation
字符除了需要存儲(chǔ),還需要排序或比較大小。推薦用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也沒(méi)啥問(wèn)題。
MySQL 8.0 默認(rèn)的是 utf8mb4_0900_ai_ci,屬于 utf8mb4_unicode_ci 中的一種,具體含義如下:
utf8mb4 已成為默認(rèn)字符集,在MySQL 8.0.1及更高版本中將utf8mb4_0900_ai_ci作為默認(rèn)排序規(guī)則。以前,utf8mb4_general_ci是默認(rèn)排序規(guī)則。由于utf8mb4_0900_ai_ci排序規(guī)則現(xiàn)在是默認(rèn)排序規(guī)則,因此默認(rèn)情況下新表格可以存儲(chǔ)基本多語(yǔ)言平面之外的字符?,F(xiàn)在可以默認(rèn)存儲(chǔ)表情符號(hào)。如果需要重音靈敏度和區(qū)分大小寫,則可以使用utf8mb4_0900_as_cs代替。
看完這篇關(guān)于淺談MySQL編碼utf8與utf8mb4 utf8mb4_unicode_ci與utf8mb4_general_ci的文章,如果覺(jué)得文章內(nèi)容寫得不錯(cuò)的話,可以把它分享出去給更多人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。