mysql 編碼和漢字儲存占用位元組問題的探索

2022-02-01 11:27:57 字數 2507 閱讀 4478

mysql 5.5 之前,utf8 編碼只支援1-3個位元組,只支援bmp這部分的unicode編碼區,bmp是從哪到哪?

基本就是 0000 ~ ffff 這一區。

從mysql 5.5 開始,可支援4個位元組utf編碼utf8mb4,乙個字元最多能有4位元組,所以能支援更多的字符集。

utf8mb4 is a superset of utf8

tf8mb4相容utf8,且比utf8能表示更多的字元。

至於什麼時候用,看你做的什麼專案了。。。

在做移動應用時,會遇到ios使用者在文字的區域輸入emoji表情,如果不做一定處理,就會導致插入資料庫異常。

mysql 5.0 以上的版本:

1、乙個漢字佔多少長度與編碼有關:

utf-8:乙個漢字 = 3個位元組,英文是乙個位元組

gbk: 乙個漢字 = 2個位元組,英文是乙個位元組

2、varchar(n) 表示n個字元,無論漢字和英文,mysql都能存入 n 個字元,僅實際位元組長度有所區別。

3、mysql檢查長度,可用sql語言 select length(fieldname) from tablename 這個命令可以看到各行使用的位元組數。

mysql版本5.6.32-78.0下面用實際例子來說明問題:

1. 首先建立一張臨時用表:

create

temporary

table

medivac(

name

varchar(10

)); charset

=utf8mb4 collate=utf8mb4_unicode_ci

2. 插入一些資料:

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)

3. 檢視表中資料:

mysql>

select

*from

medivac

->;+

--------------------------------+

| name |+--

------------------------------+

| a |

| 哈 |

|

oracle漢字占用位元組長度

1 今天調查乙個oracle資料庫問題的時候,發現在11g中乙個漢字佔2個位元組,在10g中佔3個位元組,導致將11g資料庫中的資料匯入到10g的時候總是出錯,開始的時候還以為是11g和10g的版本不一樣,漢字占用位元組數不一樣,後來一想,oracle不會這麼幹吧,那樣差別也太大了,後來一調查,發現...

Oracle 漢字占用位元組數

在oracle中乙個字元特別是中文字元佔幾個位元組是與字符集有關的。比如gbk,漢字就會佔兩個位元組,英文1個 如果是utf 8,漢字一般佔3個位元組,英文還是1個。但是一般情況下,我們都認為是兩個位元組處理,因為oracle安裝時候預設我們都選擇gbk的編碼格式,但是我們在頁面做輸入字串長度的校驗...

yii2 oracle漢字占用位元組長度

ocistmtexecute ora 12899 value too large for column wsg wx enter taste gender actual 3,maximum 2 今天調查乙個oracle資料庫問題的時候,發現在11g中乙個漢字佔2個位元組,在10g中佔3個位元組,導致...