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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 英文占几个字符_MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚...

發布時間:2024/9/19 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 英文占几个字符_MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、關于 UTF-8

UTF-8 Unicode Transformation Format-8bit。是用以解決國際上字符的一種多字節編碼。

它對英文使用 8 位(即一個字節) ,中文使用 24 位(三個字節)來編碼。

UTF-8包含全世界所有國家需要用到的字符,是國際編碼,通用性強。

UTF-8編碼的文字可以在各國支持 UTF8 字符集額的瀏覽器上顯示。

如果是UTF8編碼,則在外國人的英文 IE 也能顯示中文,他們無需下載 IE 的中文語言支持包。

二、關于 GBK

GBK 是國家標準 GB2312 基礎上擴容后兼容 GB2312 的標準。

GBK的文字編碼是用雙字節來表示的,即不論中、英文字符均使用雙字節來表示,為了區分中文,將其最高位都設定成 1。

GBK包含全部中文字符,是國家編碼,通用性比 UTF8 差,不過 UTF8 占用的數據庫比GBK大。

三、關于 utf8mb4

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

五、實際測試

1、首先使用utf8 創建 str_test 表。

CREATE TABLE `str_test` (

`name_chn` varchar(20) NOT NULL,

`name_en` varchar(20) NOT NULL

) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=utf8

然后插入值

mysql> insert into str_test values ('我愛Ruby', 'I Love Ruby!');

Query OK, 1 row affected (0.02 sec)

打開 irb

>> "我愛Ruby".size

=> 6

>> "I Love Ruby!".size

=> 12

>>

從 MySQL 中查詢出來的結果,對比

mysql> select * from str_test;

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

| name_chn | name_en |

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

| 我愛Ruby | I Love Ruby! |

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

1 row in set (0.02 sec)

mysql> select length(name_chn) from str_test;

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

| length(name_chn) |

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

| 10 |

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

1 row in set (0.01 sec)

3[一個漢字三字節] * 2 + 1[一個英文一字節] * 4 = 10

mysql> select length(name_en) from str_test;

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

| length(name_en) |

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

| 12 |

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

1 row in set (0.00 sec)

10[一個英文一字節] * 1 + 2[空格一字節] * whitespace = 12

2、使用 GBK 做測試

創建表

CREATE TABLE `str_test` (

`name_chn` varchar(20) NOT NULL,

`name_en` varchar(20) NOT NULL

) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk

插入數據,并且測試

mysql> insert into str_test values ('我愛Ruby', 'I Love Ruby!');

Query OK, 1 row affected (0.00 sec)

mysql> select * from str_test;

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

| name_chn | name_en |

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

| 我愛Ruby | I Love Ruby! |

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

1 row in set (0.01 sec)

GBK 中文是兩個字節,英文是一個字節。

mysql> select length(name_chn) from str_test;

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

| length(name_chn) |

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

| 8 |

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

1 row in set (0.00 sec)

2[中文兩個字節] * 2 + 4[英文一個字節] * 1 = 8

mysql> select length(name_en) from str_test;

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

| length(name_en) |

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

| 12 |

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

1 row in set (0.00 sec)

10[英文一個字節] * 1 + 2[空格一個字節] * whitespace = 12

六、關于 varchar 最多能存多少值

mysql 的記錄行長度是有限制的,不是無限長的,這個長度是64K,即65535個字節,對所有的表都是一樣的。

MySQL 對于變長類型的字段會有 1-2 個字節來保存字符長度。

當字符數小于等于 255 時,MySQL 只用 1 個字節來記錄,因為 2 的 8 次方減 1 只能存到 255。

當字符數多余 255 時,就得用 2 個字節來存長度了。

在utf-8狀態下的 varchar,最大只能到 (65535 - 2) / 3 = 21844 余 1。

在gbk狀態下的 varchar, 最大只能到 (65535 - 2) / 2 = 32766 余 1

使用 utf-8 創建

mysql> CREATE TABLE `str_test` (

-> `id` tinyint(1) NOT NULL,

-> `name_chn` varchar(21845) NOT NULL

-> ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=utf8

-> ;

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

mysql> CREATE TABLE `str_test` (

-> `id` tinyint(1) NOT NULL,

-> `name_chn` varchar(21844) NOT NULL

-> ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=utf8

->

->

-> ;

Query OK, 0 rows affected (0.06 sec)

使用gbk創建

當存儲長度為 32768 失敗~

mysql> CREATE TABLE `str_test` (

-> `id` tinyint(1) NOT NULL,

-> `name_chn` varchar(32768) NOT NULL

-> ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk

-> ;

ERROR 1074 (42000): Column length too big for column 'name_chn' (max = 32767); use BLOB or TEXT instead

當存儲長度為 32767 失敗~

mysql> CREATE TABLE `str_test` ( -> `id` tinyint(1) NOT NULL,

-> `name_chn` varchar(32767) NOT NULL

-> ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk

-> ;

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

當存儲長度為 32766 成功~

mysql> CREATE TABLE `str_test` (

-> `id` tinyint(1) NOT NULL,

-> `name_chn` varchar(32766) NOT NULL

-> ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk

-> ;

Query OK, 0 rows affected (0.03 sec)

smallint 用兩個字節存儲,所以

2[smallint] + 32766 * 2[varchar 存儲長度] + 2[2 個字節來存長度] > 65535

所以失敗~

mysql> CREATE TABLE `str_test` (

-> `id` smallint(1) NOT NULL,

-> `name_chn` varchar(32766) NOT NULL

-> ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk

-> ;

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

##### 七、數值類型所占的字節

類型

所占字節

int

4 字節

smallint

2 字節

tinyint

1 字節

decimal

變長

官方關于decimal 的描述如下

Values for DECIMAL (and NUMERIC) columns are represented using a binary format that packs nine decimal (base 10) digits into four bytes.

Storage for the integer and fractional parts of each value are determined separately.

Each multiple of nine digits requires four bytes, and the “leftover” digits require some fraction of four bytes.

The storage required for excess digits is given by the following table.

翻譯為中文

使用二進制格式將 9 個十進制 (基于 10) 數壓縮為 4 個字節來表示 DECIMAL 列值。

每個值的整數和分數部分的存儲分別確定。

每個 9 位數的倍數需要 4 個字節,并且 “剩余的” 位需要 4 個字節的一部分。

下表給出了超出位數的存儲需求:

Leftover Digits

Number Of Bytes

0

0

1

1

2

1

3

2

4

2

5

3

6

3

7

4

8

4

那:decimal(10,2) 占幾個字節?

1、首先 10 指的是整數與小數部分的總長度, 2 指的是小數部分的長度。那么整數部分就只有 10 - 2 = 8 位

2、因為整數與小數的存儲市各自獨立確定的,所以他們各自所占用空間的綜合就是所占的總空間了。

3、對表可知,整數部分 8 位占了 4 個字節,小數部分 2 位占了 1 個字節,所以 decimal(10,2) 總共占了 4 + 1 = 5 個字節。

4、decimal(6,2) 整數部分 (6 - 2 = 4) 位占 2 字節,小數部分 2 位占 1 字節,總共占 3 字節。

八、總結

varchar 字段是將實際內容單獨存儲在聚簇索引之外,內容開頭用 1 到 2 個字節表示實際長度(長度超過 255 時需要 2 個字節),因此最大長度不能超過 65535。

UTF-8:一個漢字 = 3 個字節,英文是一個字節

GBK: 一個漢字 = 2 個字節,英文是一個字節

在utf-8狀態下,漢字最多可以存 21844個字符串, 英文也為 21844個字符串。

在gbk狀態下,漢字最多可以存 32766個字符串,英文也為 32766個字符串。

參考

總結

以上是生活随笔為你收集整理的mysql 英文占几个字符_MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。