日韩性视频-久久久蜜桃-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 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚...的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 成人里番精品一区二区 | 成人精品免费看 | 精品自拍视频 | 欧美人与性动交a欧美精品 日韩免费高清视频 | 成人免费在线播放视频 | 少妇高潮大叫好爽喷水 | 欧美群妇大交群 | 国产毛片精品国产一区二区三区 | 日韩欧美日韩 | av噜噜 | 91手机在线观看 | 亚洲成人一二三区 | 激情视频亚洲 | 精品久久久在线观看 | 一本色道久久亚洲综合精品蜜桃 | 国产一卡二卡在线播放 | 美国一级黄色大片 | 69xxx国产 | 热久久久久久久 | 国产高清亚洲 | 牛牛精品一区二区 | 黄色在线网| 国产精品国产一区二区三区四区 | 国产又粗又猛又爽又黄av | 国产精品人人妻人人爽人人牛 | 成人污在线| 免费看污片的网站 | 久久大奶| 国产毛片久久 | 免费观看视频一区二区 | 直接看的毛片 | 天天躁夜夜躁狠狠躁 | 美女被揉胸视频 | 久久久久久91亚洲精品中文字幕 | 四虎首页 | 中文字幕大全 | 高清日韩一区二区 | 天天尻 | 在线观看日本 | 日本视频在线免费观看 | 天天想你在线观看完整版电影高清 | 天堂久久一区 | 欧美视频一区二区三区 | 香蕉久久一区二区三区 | 99视频一区 | 伊人黄色网 | 亚洲做受高潮 | 91欧美成人 | 久久人妻免费视频 | 亚洲国产精品久久久久久久 | 糖心视频在线 | 性视频网址 | 国产又黄视频 | 日韩av电影手机在线观看 | 久久久精品人妻一区二区三区色秀 | 国精品无码一区二区三区 | 亚洲天堂av免费在线观看 | 欧美三日本三级少妇三99 | 五月婷婷综合久久 | gogo人体做爰大胆视频 | 久久精品国产大片免费观看 | 亚洲高清视频一区二区 | 人碰人人 | 99re最新| 欧美大片免费看 | 久久97| 天天拍夜夜爽 | 亚洲黄色大全 | 久操福利 | 中文字幕在线观看视频一区 | 中文字幕在线官网 | 精品三级 | 久久精品国产亚洲 | 日韩免费视频一区二区视频在线观看 | 欧美激情精品久久久久久 | 美女网站免费视频 | 久久久久久九九九九 | 欧美亚洲精品一区 | 2019av视频 | 日本www黄 | 成年人视频在线免费观看 | 亚洲草逼| 岛国大片在线观看 | 久91| 中文精品在线观看 | 亚洲美女视频一区 | 男人的天堂久久久 | 日本精品久久久久中文字幕 | 一级国产片| 欧美一级性片 | 欧美一区中文字幕 | 欧美综合另类 | 视频在线一区 | 一级一片免费播放 | 欧美亚洲一区二区三区四区 | wwwxxxx在线观看 | 99网站| 久久精品视频3 | 成人午夜视频在线免费观看 |