日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

MySQL/MariaDB中如何支持全部的Unicode

瀏覽:179日期:2023-10-26 12:49:28
目錄utf8mb4介紹utf8字節數超出的報錯utf8mb4支持將默認字符編碼設置為utf8mb4,及對應排序規則。查看當前編碼修改MySQL/Mariadb的配置文件,將utf8編碼改為utf8mb4重啟MySQL/MariaDB再次查看字符集和排序規則character_set_filesystem和character_set_system的說明關于字符集設置的其他參考現有數據庫切換字符集到utf8mb4的完整過程參考

永遠不要在 MySQL 中使用 utf8,并且始終使用 utf8mb4 。

utf8mb4介紹

MySQL/MariaDB中,utf8字符集并不是對Unicode的真正實現,即不是真正的UTF-8編碼,因為它支持最多3個字節的字符。作為可變長字符編碼,UTF-8最多支持4個字節,對于emoji、中日韓繁體等部分字符,需要使用4個字節才能完整存儲。也就是,如果想要支持全部的Unicode編碼,MySQL/MariaDB中的utf8是不夠的。

UTF-8 編碼可以表示 Unicode 字符集中的每個符號,范圍從 U+000000 到 U+10FFFF。那是 1,114,112 個可能的符號(并非所有這些 Unicode 代碼點都被分配了字符,但這并不影響UTF-8對其進行編碼。Unicode實際映射了字符的共有1,112,064個碼位)。UTF-8 是一種可變寬度編碼;它使用一到四個(8位bit)字節對每個符號進行編碼。這樣既可以節省存儲低代碼值的空間,

又能充分表示所有的字符。

可以說UTF-8是最受歡迎的Unicode編碼實現。

而MySQL/MariaDB真正實現UTF-8編碼的是utf8mb4,最多支持4個字節的存儲。

總共有 1,048,576 個無法使用的可能代碼點。MySQL 的 utf8 只允許存儲所有可能的 Unicode 代碼點的 5.88% ((0x00FFFF + 1) / (0x10FFFF + 1))。正確的 UTF-8 可以編碼 100% 的所有 Unicode 代碼點。

utf8字節數超出的報錯

如果使用utf8,存儲emoji等4個字節的字符時,通常會報錯 Error: 1366 錯誤:

[Err] 1366 - Incorrect string value: ’xF0x9Fx98x93’ for column ’xxx’ at row xx

[Error] 1366 - Incorrect string value: ’x...’ for column ’xxx’ at row xx

utf8mb4支持

MySQL/MariaDB 中的utf8mb4是對原先utf8只能存儲3個字節大小的字符的一種補充,是一種真正的UTF-8編碼。

MySQL/MariaDB中如何支持全部的Unicode

MySQL 5.5.3+ 版本之后開始支持。

從 MySQL 8.0 開始默認的字符集已經變為 utf8mb4。也就是使用MySQL 8.0及以上版本,就不用擔心字節長度問題。MariaDB 10.x 版本默認的字符集仍是 latin1。因此通常情況下,應該修改為utf8mb4。

utf8mb4對應常用的排序規則為:utf8mb4_general_ci 和 utf8mb4_unicode_ci。

將默認字符編碼設置為utf8mb4,及對應排序規則。查看當前編碼

登陸MySQL/MariaDB之后,使用SHOW VARIABLES WHERE Variable_name LIKE ’character_set_%’ OR Variable_name LIKE ’collation%’;查看字符集和排序規則。

查看字符集:

MariaDB [(none)]> show variables like ’character%’;+--------------------------+------------------------------------------------+| Variable_name | Value |+--------------------------+------------------------------------------------+| character_set_client | gbk || character_set_connection | gbk || character_set_database | utf8 || character_set_filesystem | binary || character_set_results | gbk || character_set_server | utf8 || character_set_system | utf8 || character_sets_dir | C:Program FilesMariaDB 10.3nsharecharsets |+--------------------------+------------------------------------------------+8 rows in set (0.043 sec)

由于是在中文Windows下安裝的,所以含有gbk。

修改MySQL/Mariadb的配置文件,將utf8編碼改為utf8mb4 Linux系統下,修改 /etc/my.cnf 或 /etc/my.cnf.d/server.cnf 文件,在對應[mysql]、[mysqld]等下面添加內容如下: Windows系統下,修改MySQL/Mariadb安裝目錄下data/my.ini文件,同樣在對應[mysql]、[mysqld]等下面添加內容。

Linux下my.cnf :

> vim /etc/my.cnf## This group is read both both by the client and the server# use it for options that affect everything#[client-server][mysqld]character-set-server = utf8mb4init_connect=’SET NAMES utf8mb4’collation-server=utf8mb4_unicode_cicharacter-set-client-handshake=FALSE[client]default-character-set=utf8mb4[mysql]default-character-set=utf8mb4## include all files from the config directory#!includedir /etc/my.cnf.d

Windows下my.ini :

[mysqld]datadir=C:/Program Files/MariaDB 10.3n/dataport=3306character_set_server=utf8mb4# Using unique option prefix ’character_set_client’ is error-prone and can break in the future. Please use the full name ’character-set-client-handshake’ instead.character-set-client-handshake=utf8mb4 # character_set_client=utf8mb4collation-server=utf8mb4_unicode_ciinit_connect=’SET NAMES utf8mb4’skip-character-set-client-handshake=falsecharacter_set_filesystem = binarylower_case_table_names=2 [mysqldump]loose_character_set_client=utf8mb4[mysql]default-character-set=utf8mb4[client]port=3306plugin-dir=C:/Program Files/MariaDB 10.3n/lib/plugindefault-character-set=utf8mb4

幾個設置項說明:

character-set-client-handshake=FALSE 可以影響collation_connection的結果為utf8mb4_unicode_ci,而不是utf8mb4_general_ci。當然,使用SET collation_connection = utf8mb4_unicode_ci或collation_connection = utf8mb4_unicode_ci也可以。 SET NAMES 指示客戶端連接使用的字符集,即向服務器發送 SQL 語句的字符集。 character-set-server 設置服務器字符集。要正確使用 utf8mb4,需要確??蛻舳?、服務器和連接都設置為 utf8mb4。 init_connect等所有其他有關字符集的默認設置都會繼承自character-set-server,也即單獨指定init-connect、character_set_client, character_set_results,character_set_connection等都是不必須的。因此,上面設置中的init_connect可以省略。 連接的編碼值,可以使 MySQL 正確解碼輸入并對結果進行編碼。 否則會在內部重新編碼處理。

純凈的精簡的關于utf8mb4字符集和排序規則的設置,如下,只需要5項設置即可:

[client]default-character-set = utf8mb4[mysql]default-character-set = utf8mb4[mysqld]character-set-client-handshake = FALSEcharacter-set-server = utf8mb4collation-server = utf8mb4_unicode_ci重啟MySQL/MariaDB

Linux下使用systemctl restart mariadb或systemctl restart mysqld。必須使用restart重啟(非reload)。

低版本MariaDB啟動或重啟的服務名為mysqld(mysqld.service)。systemctl restart mysqld

Windows下打開“服務”,在服務中找到MariaDB或MySQL對應的服務,右鍵重啟即可。

再次查看字符集和排序規則

上面的修改重啟生效后,再次查看,如下,已經變成為utf8mb4和utf8mb4_unicode_ci。

MariaDB [(none)]> SHOW VARIABLES WHERE Variable_name LIKE ’character_set_%’ OR Variable_name LIKE ’collation%’;+--------------------------+--------------------+| 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 || collation_connection | utf8mb4_unicode_ci || collation_database | utf8mb4_unicode_ci || collation_server | utf8mb4_unicode_ci |+--------------------------+--------------------+10 rows in set (0.008 sec)character_set_filesystem和character_set_system的說明

上面顯示的字符集和排序規則可以看到,有兩項并不是utf8mb4。

character_set_filesystem 應該是二進制的,除非你使用的文件系統的文件名中支持多字節 UTF-8 編碼字符。 character_set_system 始終是 utf8 并且不能被覆蓋。關于字符集設置的其他參考

上面的設置已經是正確的修改utf8mb4的設置。下面將可能的幾個相關設置項列出來,供可能的參考(雖然基本用不到):

[client]default-character-set = utf8mb4[mysql]default-character-set = utf8mb4[mysqld]explicit_defaults_for_timestamp = 1 # Posting it here as a tip to disable the Timestamp message, maybe it can help someone :)character-set-client-handshake = 0 # FALSEinit_connect = ’SET character_set_system = utf8mb4’init_connect = ’SET character_set_connection = utf8mb4’init_connect = ’SET character_set_database = utf8mb4’init_connect = ’SET character_set_results = utf8mb4’init_connect = ’SET collation_database = utf8mb4_unicode_ci’init_connect = ’SET collation_connection = utf8mb4_unicode_ci’init_connect = ’SET NAMES utf8mb4’character-set-server = utf8mb4#character_set_client = utf8mb4collation-server = utf8mb4_unicode_cicollation_connection = utf8mb4_unicode_cicollation_database= utf8mb4_unicode_ci

多個init_connect也可以這樣設置:init_connect = ’SET collation_connection = utf8mb4_unicode_ci,NAMES utf8mb4’。未驗證

現有數據庫切換字符集到utf8mb4的完整過程

如果數據庫創建之初就是utf8mb4,則就沒有這些煩心事了?。。?/p>

第 1 步:創建備份創建要升級的服務器上所有數據庫的備份。安全第一!

第 2 步:升級MySQL服務器將 MySQL 服務器升級到 v5.5.3+。MySQL升級到8.0就不用第5步MySQL服務器字符集的修改了,默認就是utf8mb4。MariaDB還需要修改字符集。

第 3 步:修改數據庫、表和列將數據庫、表和列的字符集和排序規則屬性更改為使用 utf8mb4 。

# For each database:ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;# For each table:ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;# For each column:ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;# (不要盲目復制粘貼!具體的語句取決于列類型、最大長度和其他屬性。上面這行只是一個`VARCHAR`列的例子。)# 或者modefy語句ALTER TABLE table_name MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

第 4 步:檢查列和索引鍵的最大長度

這可能是整個升級過程中最乏味的部分。

從 utf8 轉換為 utf8mb4 時,列或索引鍵的最大長度以字節為單位不變。因此,它在字符方面更小,因為字符的最大長度現在是四個字節而不是三個字節。

例如,TINYTEXT 列最多可容納 255 個字節,這與 85 個三字節字符或 63 個四字節字符相關。假設你有一個使用 utf8 的 TINYTEXT 列,但必須能夠包含 63 個以上的字符。鑒于此要求,無法將此列轉換為 utf8mb4,除非還將數據類型更改為更長的類型,例如 TEXT — 因為如果你嘗試用四字節字符填充它,將只能輸入 63 個字符,但不能更多。索引鍵也是如此。 InnoDB 存儲引擎的最大索引長度為 767 字節,因此對于 utf8 或 utf8mb4 列,您最多可以分別索引 255 或 191 個字符。如果您當前有索引長度超過 191 個字符的 utf8 列,則在使用 utf8mb4 時需要索引較少數量的字符。 (因此,我不得不將一些索引的 VARCHAR(255) 列更改為 VARCHAR(191)。)

第 5 步:修改連接、客戶端和服務器字符集

在應用程序代碼中,將連接字符集設置為 utf8mb4。這可以通過簡單地用 SET NAMES utf8mb4 替換 SET NAMES utf8 來完成。同時排序規則也要對應修改,例如 SET NAMES utf8 COLLATE utf8_unicode_ci 變為 SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci。

確保同時設置客戶端和服務器字符集。

MySQL 配置文件 (/etc/my.cnf) 中有以下內容:

[client]default-character-set = utf8mb4[mysql]default-character-set = utf8mb4[mysqld]character-set-client-handshake = FALSEcharacter-set-server = utf8mb4collation-server = utf8mb4_unicode_ci

第 6 步:修復優化所有表( Repair and optimize )升級 MySQL 服務器并進行上述必要更改后,請確保修復和優化所有數據庫和表。否則可能會遇到奇怪的錯誤,即使沒有錯誤被拋出??梢詾橐迯秃蛢灮拿總€表運行以下 MySQL 查詢:

# For each tableREPAIR TABLE table_name;OPTIMIZE TABLE table_name;

該工作,可以使用命令行 mysqlcheck 實用程序一次性輕松完成:

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases

這將提示輸入root用戶的密碼,之后將修復和優化所有數據庫中的所有表。

參考

主要參考翻譯自:How to support full Unicode in MySQL databases,歡迎閱讀原文。

到此這篇關于MySQL/MariaDB中如何支持全部的Unicode的文章就介紹到這了,更多相關MySQL/MariaDB支持Unicode內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
美女久久久精品| 久久精品电影| 一区二区电影| 美女视频黄 久久| 免费毛片在线不卡| 91精品观看| 欧美一区二区三区久久精品| 日韩中文在线电影| 日本欧美一区二区在线观看| 91一区二区三区四区| 亚洲黄色网址| 日韩欧美美女在线观看| 97精品国产一区二区三区| 欧美精品中文| 久久久精品网| 午夜久久av| 四虎精品一区二区免费| 免费人成精品欧美精品| 中文亚洲欧美| 伊人精品久久| 一区二区三区四区日韩| 亚洲综合专区| 国产香蕉精品| 国产成人77亚洲精品www| 国产91欧美| 亚洲午夜在线| 亚洲精品综合| 国产精品一区毛片| 神马久久午夜| 国产高潮在线| 婷婷亚洲五月| 日韩福利在线观看| 91九色综合| 波多野结衣久久精品| 午夜在线一区| 国产欧美日韩视频在线 | 伊人精品一区| 视频一区二区中文字幕| 欧美日韩一区二区三区四区在线观看| 精品视频97| 国产午夜精品一区二区三区欧美 | 欧美xxxx性| 人人香蕉久久| 亚洲日本在线观看视频| 国产成人免费视频网站视频社区| 欧美aa国产视频| 日本三级亚洲精品| 国产精品久久久久久久久久齐齐| 日韩一区二区在线免费| 最新国产精品| 狠狠躁少妇一区二区三区| 欧美日韩精品一本二本三本| 久久精品99国产国产精| 99久久亚洲精品蜜臀| 免播放器亚洲| 福利一区二区| 亚洲精品国产精品粉嫩| 国产综合色区在线观看| 91伊人久久| 亚洲精品99| 久久97视频| 麻豆91精品| 久久电影tv| 国产日韩亚洲| 另类国产ts人妖高潮视频| 久久亚洲道色| 亚欧洲精品视频在线观看| 在线看片福利| 日本精品在线播放| 日韩一区欧美| 国产免费久久| 鲁大师成人一区二区三区| 高清久久一区| 亚洲综合福利| 亚洲91久久| 精品国产一区二区三区av片| 天堂成人国产精品一区| 亚洲精品永久免费视频| 欧美日韩18| 日韩中文字幕一区二区三区| 日韩黄色大片| 免费亚洲婷婷| 日本在线一区二区三区| 999在线观看精品免费不卡网站| 亚洲精一区二区三区| 亚洲高清激情| 高清在线一区| 国产精品午夜av| 免费成人在线视频观看| 视频福利一区| 欧美激情网址| 亚洲+小说+欧美+激情+另类| 欧美日韩国产在线观看网站| 美女尤物国产一区| 日本色综合中文字幕| 欧美另类综合| 日韩一区二区三区免费| 国产高清亚洲| 日韩欧美三区| 中文一区二区| 国产一区久久| 色天使综合视频| 久久精品国产福利| 国产精品久久久久久久久久齐齐| 中文字幕av亚洲精品一部二部| 99在线|亚洲一区二区| 韩国精品主播一区二区在线观看 | 精品免费av在线| 国产精品xx| 久草精品视频| 久久av影院| 国产精品亚洲人成在99www| 亚洲在线电影| 一区在线免费| 一区在线免费| 久久成人国产| 麻豆9191精品国产| 亚洲一级大片| 日韩av成人高清| 久久精品xxxxx| 国产精品成人3p一区二区三区| 国产三级一区| 免费在线欧美黄色| 久久久国产精品网站| 精品三级在线观看视频| 国产91欧美| 久久久久国产精品一区二区| 国产精品yjizz视频网| 狠狠躁少妇一区二区三区| 亚洲国产福利| 四虎4545www国产精品| 99精品美女| 国产亚洲毛片在线| 美女91精品| 日本不卡视频在线观看| 欧美有码在线| 电影91久久久| 日韩在线观看不卡| 国产亚洲福利| 91午夜精品| 国产在线观看91一区二区三区| 福利一区二区免费视频| 欧美国产小视频| 久久国产日韩| 视频在线观看一区二区三区| 五月亚洲婷婷 | 日韩欧美精品一区二区综合视频| 欧美亚洲tv| 国产一区丝袜| 欧美亚洲国产激情| 99在线观看免费视频精品观看| 视频一区二区国产| 国产精品1区| 欧美黄色网页| 在线免费观看亚洲| 美女在线视频一区| 久久五月天小说| 亚洲天堂日韩在线| 欧美黄页在线免费观看| 激情综合网址| 日韩欧美中文在线观看| 国产aⅴ精品一区二区三区久久| 欧美成人久久| 日韩av一二三| 亚洲性色av| 老司机精品久久| 久久av中文| 欧美日韩国产亚洲一区| 日韩欧美中文字幕一区二区三区 | 国产麻豆精品久久| 亚洲精品一级二级| 午夜电影一区| 日韩一区三区| 日韩精品亚洲专区在线观看| 国产一区二区久久久久| 亚洲免费高清| 久久国产三级| 日韩欧美1区| 亚洲91在线| 日韩精品第一区| 日韩精品福利一区二区三区| 久久久久久色 | 精品网站aaa| 欧美日韩国产高清| 免费在线欧美黄色| 视频一区二区三区入口| 国语精品一区| 免费在线观看不卡| 国产精品久久久久久久久久10秀| 一区二区91| 中文字幕人成乱码在线观看| 日韩中文字幕无砖| 美女网站视频一区| 欧美日韩va| 99国内精品| 日韩高清欧美| 国产精品多人| 少妇精品久久久一区二区| 日韩欧美国产精品综合嫩v| 日韩一区二区三区高清在线观看 |