mysql 编码和汉字存储占用字节问题的探索
MySql 5.5 之前,UTF8 編碼只支持1-3個(gè)字節(jié),只支持BMP這部分的unicode編碼區(qū),BMP是從哪到哪?
戳這里 基本就是 0000 ~ FFFF 這一區(qū)。
從MySQL 5.5 開(kāi)始,可支持4個(gè)字節(jié)UTF編碼utf8mb4,一個(gè)字符最多能有4字節(jié),所以能支持更多的字符集。
utf8mb4 is a superset of utf8
tf8mb4兼容utf8,且比utf8能表示更多的字符。
至于什么時(shí)候用,看你做的什么項(xiàng)目了。。。
在做移動(dòng)應(yīng)用時(shí),會(huì)遇到IOS用戶(hù)在文本的區(qū)域輸入emoji表情,如果不做一定處理,就會(huì)導(dǎo)致插入數(shù)據(jù)庫(kù)異常。
MySql 5.0 以上的版本:
1、一個(gè)漢字占多少長(zhǎng)度與編碼有關(guān):
UTF-8:一個(gè)漢字 = 3個(gè)字節(jié),英文是一個(gè)字節(jié)
GBK: 一個(gè)漢字 = 2個(gè)字節(jié),英文是一個(gè)字節(jié)
2、varchar(n) 表示n個(gè)字符,無(wú)論漢字和英文,MySql都能存入 n 個(gè)字符,僅實(shí)際字節(jié)長(zhǎng)度有所區(qū)別。
3、MySQL檢查長(zhǎng)度,可用SQL語(yǔ)言 SELECT LENGTH(fieldname) FROM tablename 這個(gè)命令可以看到各行使用的字節(jié)數(shù)。
mysql版本5.6.32-78.0下面用實(shí)際例子來(lái)說(shuō)明問(wèn)題:
首先創(chuàng)建一張臨時(shí)用表:
插入一些數(shù)據(jù):
INSERT INTO medivac (name) VALUES ('' at line 1 mysql> INSERT INTO medivac (name) VALUES ('a'); Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO medivac (name) VALUES ('哈'); Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO medivac (name) VALUES ('\U+1F604'); Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO medivac (name) VALUES ('哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈'); Query OK, 1 row affected, 1 warning (0.00 sec)查看表中數(shù)據(jù):
mysql> select * from medivac-> ; +--------------------------------+ | name | +--------------------------------+ | a | | 哈 | | ? | | 哈哈哈哈哈哈哈哈哈哈 | +--------------------------------+查看占用字節(jié)數(shù):
+--------------+ | length(name) | +--------------+ | 1 | | 3 | | 4 | | 30 | +--------------+沒(méi)什么好說(shuō)的 一目了然,注意,如果存儲(chǔ)超過(guò)字段規(guī)定的最大字符數(shù),后面存儲(chǔ)的東西會(huì)被無(wú)視,并且曝出一個(gè)warning。詳見(jiàn)過(guò)程2的信息。
總結(jié):
一個(gè)varchar存漢字需要使用三個(gè)字段在utf8和utf8mb4編碼表的情況下。
如果需要存儲(chǔ)emoji表情的需求,新表的默認(rèn)編碼方式應(yīng)該寫(xiě)為utf8mb4。另外提一點(diǎn)在最新發(fā)布的mysql8.0里面,默認(rèn)編碼方式已經(jīng)是utf8mb4了。
在utf8和utf8mb4中 varchar(n)這個(gè)n是字符,所見(jiàn)即所得,一個(gè)a是一個(gè)字符一個(gè)?也是一個(gè)字符 不過(guò)就是a這個(gè)字符是1個(gè)字節(jié) 哈這個(gè)字符是3個(gè)字節(jié) 而?這個(gè)字符是4個(gè)字節(jié)表示罷了
Reference:
https://www.tutorialspoint.co... MySQL Temporary Tables
https://ruby-china.org/topics... MySQL 數(shù)據(jù)庫(kù) varchar 到底可以存多少個(gè)漢字,多少個(gè)英文呢?我們來(lái)搞搞清楚
總結(jié)
以上是生活随笔為你收集整理的mysql 编码和汉字存储占用字节问题的探索的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ES6笔记(1) -- 环境配置支持
- 下一篇: SQLServer文件收缩-图形化+命令