日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql 编码和汉字存储占用字节问题的探索

發(fā)布時(shí)間:2024/4/13 数据库 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 编码和汉字存储占用字节问题的探索 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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í)用表:

  • create TEMPORARY table medivac(name VARCHAR(10)); CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  • 插入一些數(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。