教你如何在?MySQL?數(shù)據(jù)庫中支持完整的Unicode
在你的數(shù)據(jù)庫中使用 MySQL 的 utf8 字符集嗎? 在這篇文章中,我將解釋為什么你應(yīng)該改用 utf8mb4,以及如何去做。
UTF-8
UTF-8編碼可以表示Unicode字符集中的每一個符號,范圍從到。 那是 1,114,112 個可能的符號。 (并非所有這些 Unicode 代碼點都已分配字符,但這并不妨礙 UTF-8 能夠?qū)λ鼈冞M(jìn)行編碼。)
UTF-8 是一種可變寬度編碼;可以參考Unicode 字符集和 UTF-8、UTF-16、UTF-32 編碼這篇文章 它使用一到四個 8 位字節(jié)對每個符號進(jìn)行編碼。 具有較低數(shù)字代碼點值的符號使用較少的字節(jié)進(jìn)行編碼。 這樣,UTF-8 針對使用 ASCII 字符和其他 BMP 符號(其代碼點范圍從 到 )的常見情況進(jìn)行了優(yōu)化——同時仍然允許星體符號(其代碼點范圍從 到 ) 被存儲。
MySQL 中的 utf8
很長一段時間,我一直在為數(shù)據(jù)庫、表和列使用 MySQL 的 utf8 字符集,假設(shè)它映射到上述 UTF-8 編碼。 通過使用 utf8,我可以在我的數(shù)據(jù)庫中存儲我想要的任何符號——或者我是這么認(rèn)為的。
在寫 JavaScript 的內(nèi)部字符編碼時,我注意到無法將 符號插入到該站點后面的 MySQL 數(shù)據(jù)庫中。 我嘗試更新的列具有 排序規(guī)則,并且連接字符集設(shè)置為 utf8。
mysql> SET NAMES utf8; # just to emphasize that the connection charset is set to `utf8` Query OK, 0 rows affected (0.00 sec) mysql> UPDATE database_name.table_name SET column_name = 'foo??bar' WHERE id = 9001; Query OK, 1 row affected, 1 warning (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 1 mysql> SELECT column_name FROM database_name.table_name WHERE id = 9001; +-------------+ | column_name | +-------------+ | foo | +-------------+ 1 row in set (0.00 sec)
內(nèi)容在第一個 符號處被截斷,在本例中為 — 因此,嘗試插入 實際上插入的是 ,導(dǎo)致數(shù)據(jù)丟失(并可能引入安全問題;見下文)。 MySQL 也返回一條警告消息:
mysql> SHOW WARNINGS; +---------+------+------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------------------------------------------+ | Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 | +---------+------+------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
事實證明,MySQL 的 utf8 字符集僅部分實現(xiàn)了正確的 UTF-8 編碼。 它只能存儲由一到三個字節(jié)組成的 UTF-8 編碼符號; 不支持占用四個字節(jié)的編碼符號。
由于星體符號(其代碼點范圍從 到 )在 UTF-8 中均由四個字節(jié)組成,因此我們不能使用 MySQL 的 utf8 實現(xiàn)來存儲它們。
這不僅會影響 字符,還會影響更重要的符號,例如 。 總共有 1,048,575 個可能的代碼點是我們不能使用的。 事實上,MySQL 的 utf8 只允許我們存儲所有可能的 Unicode 代碼點的 5.88% 。 正確的 UTF-8 可以編碼所有 Unicode 代碼點的 100% 。
MySQL 中的 utf8mb4
幸運(yùn)的是,MySQL 5.5.3(2010 年初發(fā)布)引入了一種名為 utf8mb4 的新編碼,它映射到正確的 UTF-8,因此完全支持 Unicode,包括星體符號。
我們可以參考 MySQL 編碼utf8 與 utf8mb4 utf8mb4_unicode_ci 與 utf8mb4_general_ci
總結(jié)
永遠(yuǎn)不要在 MySQL 中使用 utf8——總是使用 utf8mb4。 更新數(shù)據(jù)庫和代碼可能需要一些時間,但絕對值得付出努力。 為什么要任意限制可以在數(shù)據(jù)庫中使用的符號集? 為什么每次用戶輸入星體符號作為評論或消息的一部分或我們存儲在數(shù)據(jù)庫中的任何內(nèi)容時,都會丟失數(shù)據(jù)? 沒有理由不在所有地方爭取完全的 支持。 做正確的事,使用 utf8mb4。
到此這篇關(guān)于如何在 MySQL 數(shù)據(jù)庫中支持完整的 Unicode的文章就介紹到這了,更多相關(guān)mysql支持 Unicode內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Mysql連接數(shù)據(jù)庫時host和user的匹配規(guī)則
這篇文章主要介紹了淺談Mysql連接數(shù)據(jù)庫時host和user的匹配規(guī)則,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01MySQL表的內(nèi)外連接和視圖使用實戰(zhàn)練習(xí)
這篇文章主要給大家介紹了關(guān)于MySQL表的內(nèi)外連接和視圖使用的相關(guān)資料,MySQL的內(nèi)外連接查詢是用于將兩個或多個表中的數(shù)據(jù)進(jìn)行關(guān)聯(lián)查詢的一種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01mysql時間戳格式化函數(shù)from_unixtime使用的簡單說明
mysql中的FROM_UNIXTIME函數(shù)可以數(shù)據(jù)庫中整型類的時間戳格式化為字符串的日期時間格式,下面這篇文章主要給大家介紹了關(guān)于mysql時間戳格式化函數(shù)from_unixtime使用的簡單說明,需要的朋友可以參考下2022-08-08mysqldump數(shù)據(jù)庫備份參數(shù)詳解
這篇文章主要介紹了mysqldump數(shù)據(jù)庫備份參數(shù)詳解,需要的朋友可以參考下2014-05-05