婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL/MariaDB中如何支持全部的Unicode

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

熱門標簽:400電話可以辦理嗎 拉卡拉外呼系統 高清地圖標注道路 臨清電話機器人 大眾點評星級酒店地圖標注 智能外呼系統復位 云南電商智能外呼系統價格 外東北地圖標注 話務外呼系統怎么樣

永遠不要在 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: '\xF0\x9F\x98\x93' 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 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 Files\MariaDB 10.3n\share\charsets\ |
+--------------------------+------------------------------------------------+
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 = utf8mb4
init_connect='SET NAMES utf8mb4'
collation-server=utf8mb4_unicode_ci
character-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/data
port=3306
character_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=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake=false
character_set_filesystem = binary
lower_case_table_names=2 

[mysqldump]
loose_character_set_client=utf8mb4

[mysql]
default-character-set=utf8mb4

[client]
port=3306
plugin-dir=C:/Program Files/MariaDB 10.3n/lib/plugin
default-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 = FALSE
character-set-server = utf8mb4
collation-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 # FALSE
init_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                     = utf8mb4
collation-server                          = utf8mb4_unicode_ci
collation_connection                      = utf8mb4_unicode_ci
collation_database                        = utf8mb4_unicode_ci

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

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

如果數據庫創建之初就是utf8mb4,則就沒有這些煩心事了!!!

第 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 = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

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

# For each table
REPAIR 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錯誤代碼1130的解決方法
  • mysql error 1130 hy000:Host''localhost''解決方案
  • MySQL連接異常報10061錯誤問題解決
  • mac安裝mysql數據庫及配置環境變量的圖文教程
  • 基于JavaSwing+mysql開發一個學生社團管理系統設計和實現
  • Linux下MySQL多實例部署及安裝指南
  • docker 部署mysql連接問題及遇到的坑
  • MySQL 1130異常,無法遠程登錄解決方案詳解

標簽:定西 三明 無錫 溫州 福州 阿里 揚州 山西

巨人網絡通訊聲明:本文標題《MySQL/MariaDB中如何支持全部的Unicode》,本文關鍵詞  MySQL,MariaDB,中,如何,支持,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL/MariaDB中如何支持全部的Unicode》相關的同類信息!
  • 本頁收集關于MySQL/MariaDB中如何支持全部的Unicode的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美精品久久天天躁| 91精品国产一区二区三区蜜臀 | 欧美成人国产一区二区| 亚洲亚洲人成综合网络| 99视频精品全部免费在线| 久久久九九九九| 国产成人综合在线播放| 不卡的av网站| 色哟哟日韩精品| 亚洲国产精品精华液ab| 国产盗摄一区二区| 国产亚洲综合在线| 在线中文字幕一区二区| 亚洲精品乱码久久久久久| 91在线精品秘密一区二区| 国产精品激情偷乱一区二区∴| 色一区在线观看| 午夜亚洲国产au精品一区二区| 在线观看91av| 日本少妇一区二区| 欧美午夜寂寞影院| 国产成人一区二区精品非洲| 久久久久久毛片| av网站一区二区三区| 欧美激情综合网| 亚洲mv在线观看| 一区二区在线看| 高清久久久久久| 亚洲精品免费电影| 欧美日精品一区视频| 婷婷激情综合网| 欧美性色欧美a在线播放| 久久99精品国产.久久久久 | 日韩欧美第一区| 精品亚洲porn| 最新久久zyz资源站| 高清不卡一二三区| 免费看日韩精品| 国产精品日日摸夜夜摸av| 欧美视频在线不卡| 国产精品欧美综合在线| 久久久久久久久久久久久夜| 国产成人午夜片在线观看高清观看| 亚洲成人激情综合网| 成人午夜私人影院| 26uuu成人网一区二区三区| 亚洲综合色噜噜狠狠| 国产成都精品91一区二区三 | 欧美性受xxxx黑人xyx| 国产精品区一区二区三区| 风间由美中文字幕在线看视频国产欧美 | 激情五月激情综合网| 精品日韩在线一区| 成人深夜福利app| 一区在线中文字幕| 久久精品一区四区| 欧美日韩精品二区第二页| 国产精华液一区二区三区| 亚洲国产精品一区二区久久恐怖片| 欧美r级电影在线观看| 69久久99精品久久久久婷婷| 91尤物视频在线观看| 视频一区在线播放| 18涩涩午夜精品.www| 欧美性xxxxxxxx| 在线欧美日韩精品| 国产suv精品一区二区三区| 日本在线不卡一区| 日韩国产欧美一区二区三区| 日本成人在线不卡视频| 日韩精品成人一区二区在线| 17c精品麻豆一区二区免费| 久久久国产午夜精品| 久久精品水蜜桃av综合天堂| 国产女人18毛片水真多成人如厕 | 国产精品美女久久久久久久久久久 | 欧美日产在线观看| 欧美高清www午色夜在线视频| 欧美日韩三级一区二区| 欧美疯狂做受xxxx富婆| 欧美一级高清片在线观看| 日韩免费视频线观看| 精品久久久久香蕉网| 久久精品在线观看| 中文字幕日韩欧美一区二区三区| 亚洲婷婷综合色高清在线| 亚洲精品中文字幕在线观看| 亚洲午夜影视影院在线观看| 日韩电影在线免费| 极品少妇一区二区| 成人a级免费电影| 在线视频亚洲一区| 91精品国产综合久久精品图片| 日韩精品一区在线| 国产精品免费aⅴ片在线观看| 亚洲激情自拍视频| 视频一区二区不卡| 精品一区二区免费在线观看| 大白屁股一区二区视频| 欧美专区日韩专区| 精品免费一区二区三区| 中文在线免费一区三区高中清不卡| 日韩理论在线观看| 亚洲超碰97人人做人人爱| 欧美男同性恋视频网站| 91福利精品第一导航| 欧美人与z0zoxxxx视频| 久久蜜桃av一区二区天堂| 综合激情网...| 日韩和欧美一区二区三区| 国产一区二区三区四区五区入口 | 欧美国产亚洲另类动漫| 亚洲图片欧美综合| 国产在线视频精品一区| 99热精品国产| 91精品国产91综合久久蜜臀| 国产亚洲精品bt天堂精选| 亚洲久本草在线中文字幕| 免费久久99精品国产| 99久久久精品| 精品久久久久av影院| 一区二区欧美在线观看| 久久99精品一区二区三区| 在线观看亚洲a| 欧美激情综合五月色丁香小说| 亚洲成人7777| 国产成人精品三级| 欧美日韩一区二区三区在线| 中文字幕免费不卡在线| 亚洲一区二区三区四区在线免费观看 | 9191精品国产综合久久久久久| 久久久精品2019中文字幕之3| 亚洲图片激情小说| 蜜臀久久久久久久| 在线观看日韩高清av| 国产午夜精品福利| 轻轻草成人在线| 欧美日韩精品系列| 久久九九影视网| 亚洲gay无套男同| 成人av免费网站| 久久综合色一综合色88| 亚洲国产综合在线| 99精品久久99久久久久| 久久综合一区二区| 免费观看91视频大全| 欧美美女一区二区在线观看| 中文字幕在线不卡视频| 国产大片一区二区| 精品电影一区二区| 麻豆91精品91久久久的内涵| 精品视频一区二区三区免费| 亚洲国产成人在线| 国产精品亚洲人在线观看| 欧美一区二区三区成人| 亚洲高清免费视频| 在线视频中文字幕一区二区| 亚洲视频小说图片| 国产老妇另类xxxxx| 7777女厕盗摄久久久| 亚洲一区二区三区四区五区黄| 成人高清在线视频| 亚洲国产激情av| 国产又粗又猛又爽又黄91精品| 欧美伊人久久久久久午夜久久久久| 国产精品污污网站在线观看 | 日韩精品免费视频人成| 99精品视频一区| 成人欧美一区二区三区视频网页| 国产成人在线视频网站| 国产肉丝袜一区二区| 国产精品亚洲专一区二区三区 | 成人丝袜视频网| 国产精品国产三级国产三级人妇| www.成人在线| 亚洲精品国产第一综合99久久 | 久久久www成人免费无遮挡大片| 麻豆精品蜜桃视频网站| 久久这里只有精品视频网| 国产激情一区二区三区桃花岛亚洲| 国产欧美综合在线观看第十页| 国产中文字幕一区| 亚洲国产精品高清| 91在线无精精品入口| 亚洲日本在线视频观看| 欧洲一区二区三区在线| 五月综合激情婷婷六月色窝| 91精品啪在线观看国产60岁| 久久国产精品露脸对白| 欧美精品一区二区三区在线| 国产成人精品免费| 久久精品免费在线观看| 国产成a人亚洲| 国产精品二三区| 欧美亚洲一区三区| 日本午夜一区二区| 精品国产一区二区国模嫣然| 国产精品一区二区不卡| 欧美日韩综合不卡| 久久久国产一区二区三区四区小说 |