mysql varchar 2000能存_mysql 数据库 varchar 到底可以存多少数据呢,长文慎入
一、關(guān)于UTF-8 UTF-8 Unicode Transformation Format-8bit。是用以解決國(guó)際上字符的一種多字節(jié)編碼。 它對(duì)英文使用8位(即一個(gè)字節(jié)),中文使用24位(三個(gè)字節(jié))來(lái)編碼。 UTF-8包含全世界所有國(guó)家需要用到的字符,是國(guó)際編碼,通用性強(qiáng)。 UTF-8編碼的文字可以在各國(guó)支持UTF8字符集額的瀏覽器上顯示。 如果是UTF8編碼,則在外國(guó)人的英文IE也能顯示中文,他們無(wú)需下載IE的中文語(yǔ)言支持包。 二、關(guān)于GBK GBK 是國(guó)家標(biāo)準(zhǔn)GB2312基礎(chǔ)上擴(kuò)容后兼容GB2312的標(biāo)準(zhǔn)。 GBK的文字編碼是用雙字節(jié)來(lái)表示的,即不論中、英文字符均使用雙字節(jié)來(lái)表示,為了區(qū)分中文,將其最高位都設(shè)定成1。 GBK包含全部中文字符,是國(guó)家編碼,通用性比UTF8差,不過(guò)UTF8占用的數(shù)據(jù)庫(kù)比GBK大。 三、關(guān)于utf8mb4 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用戶在文本的區(qū)域輸入emoji表情,如果不做一定處理,就會(huì)導(dǎo)致插入數(shù)據(jù)庫(kù)異常。 四、漢字長(zhǎng)度與編碼有關(guān) 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 五、實(shí)際測(cè)試 1、首先使用utf8 創(chuàng)建 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 ('我愛(ài)Ruby', 'I Love Ruby!'); Query OK, 1 row affected (0.02 sec) 打開(kāi)irb >> "我愛(ài)Ruby".size => 6 >> "I Love Ruby!".size => 12 >> 從MySQL中查詢出來(lái)的結(jié)果,對(duì)比 mysql> select * from str_test; +------------+--------------+ | name_chn | name_en | +------------+--------------+ | 我愛(ài)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[一個(gè)漢字一字節(jié)] * 2 + 1[一個(gè)英文一字節(jié)] * 4 = 10 mysql> select length(name_en) from str_test; +-----------------+ | length(name_en) | +-----------------+ | 12 | +-----------------+ 1 row in set (0.00 sec) 10[一個(gè)英文一字節(jié)] * 1 + 2[空格一字節(jié)] * whitespace = 12 2、使用 GBK 做測(cè)試 創(chuàng)建表 CREATE TABLE `str_test` ( `name_chn` varchar(20) NOT NULL, `name_en` varchar(20) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk 插入數(shù)據(jù),并且測(cè)試 mysql> insert into str_test values ('我愛(ài)Ruby', 'I Love Ruby!'); Query OK, 1 row affected (0.00 sec) mysql> select * from str_test; +------------+--------------+ | name_chn | name_en | +------------+--------------+ | 我愛(ài)Ruby | I Love Ruby! | +------------+--------------+ 1 row in set (0.01 sec) GBK 中文是兩個(gè)字節(jié),英文是一個(gè)字節(jié)。 mysql> select length(name_chn) from str_test; +------------------+ | length(name_chn) | +------------------+ | 8 | +------------------+ 1 row in set (0.00 sec) 2[中文兩個(gè)字節(jié)] * 2 + 4[英文一個(gè)字節(jié)] * 1 = 8 mysql> select length(name_en) from str_test; +-----------------+ | length(name_en) | +-----------------+ | 12 | +-----------------+ 1 row in set (0.00 sec) 10[英文一個(gè)字節(jié)] * 1 + 2[空格一個(gè)字節(jié)] * whitespace = 12 六、關(guān)于varchar 最多能存多少值 mysql的記錄行長(zhǎng)度是有限制的,不是無(wú)限長(zhǎng)的,這個(gè)長(zhǎng)度是64K,即65535個(gè)字節(jié),對(duì)所有的表都是一樣的。 MySQL對(duì)于變長(zhǎng)類型的字段會(huì)有1-2個(gè)字節(jié)來(lái)保存字符長(zhǎng)度。 當(dāng)字符數(shù)小于等于255時(shí),MySQL只用1個(gè)字節(jié)來(lái)記錄,因?yàn)?的8次方減1只能存到255。 當(dāng)字符數(shù)多余255時(shí),就得用2個(gè)字節(jié)來(lái)存長(zhǎng)度了。 在utf-8狀態(tài)下的varchar,最大只能到 (65535 - 2) / 3 = 21844 余 1。 在gbk狀態(tài)下的varchar, 最大只能到 (65535 - 2) / 2 = 32766 余 1 使用 utf-8 創(chuàng)建 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創(chuàng)建 當(dāng)存儲(chǔ)長(zhǎng)度為 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 當(dāng)存儲(chǔ)長(zhǎng)度為 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 當(dāng)存儲(chǔ)長(zhǎng)度為 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 用兩個(gè)字節(jié)存儲(chǔ),所以 2[smallint] + 32766 * 2[varchar存儲(chǔ)長(zhǎng)度] + 2[2個(gè)字節(jié)來(lái)存長(zhǎng)度] > 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 七、數(shù)值類型所占的字節(jié) 類型 所占字節(jié) int 4 字節(jié) smallint 2 字節(jié) tinyint 1 字節(jié) decimal 變長(zhǎng) 官方關(guān)于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 “l(fā)eftover” digits require some fraction of four bytes. The storage required for excess digits is given by the following table. 翻譯為中文 使用二進(jìn)制格式將9個(gè)十進(jìn)制(基于10)數(shù)壓縮為4個(gè)字節(jié)來(lái)表示DECIMAL列值。 每個(gè)值的整數(shù)和分?jǐn)?shù)部分的存儲(chǔ)分別確定。 每個(gè)9位數(shù)的倍數(shù)需要4個(gè)字節(jié),并且“剩余的”位需要4個(gè)字節(jié)的一部分。 下表給出了超出位數(shù)的存儲(chǔ)需求: 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)占幾個(gè)字節(jié)? 1、首先 10 指的是整數(shù)與小數(shù)部分的總長(zhǎng)度, 2指的是小數(shù)部分的長(zhǎng)度。那么整數(shù)部分就只有 10 - 2 = 8 位 2、因?yàn)檎麛?shù)與小數(shù)的存儲(chǔ)市各自獨(dú)立確定的,所以他們各自所占用空間的綜合就是所占的總空間了。 3、對(duì)表可知,整數(shù)部分8位占了4個(gè)字節(jié),小數(shù)部分2位占了1個(gè)字節(jié),所以decimal(10,2)總共占了 4 + 1 = 5 個(gè)字節(jié)。 4、decimal(6,2) 整數(shù)部分(6 - 2 = 4) 位占2字節(jié),小數(shù)部分2位占1字節(jié),總共占3字節(jié)。 八、總結(jié) varchar 字段是將實(shí)際內(nèi)容單獨(dú)存儲(chǔ)在聚簇索引之外,內(nèi)容開(kāi)頭用1到2個(gè)字節(jié)表示實(shí)際長(zhǎng)度(長(zhǎng)度超過(guò)255時(shí)需要2個(gè)字節(jié)),因此最大長(zhǎng)度不能超過(guò)65535。 UTF-8:一個(gè)漢字 = 3個(gè)字節(jié),英文是一個(gè)字節(jié) GBK: 一個(gè)漢字 = 2個(gè)字節(jié),英文是一個(gè)字節(jié) 在utf-8狀態(tài)下,漢字最多可以存 21844個(gè)字符串, 英文也為 21844個(gè)字符串。 在gbk狀態(tài)下,漢字最多可以存32766個(gè)字符串,英文也為21844個(gè)字符串。
總結(jié)
以上是生活随笔為你收集整理的mysql varchar 2000能存_mysql 数据库 varchar 到底可以存多少数据呢,长文慎入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python commands_Wind
- 下一篇: mysql聚簇索引 和主键的区别_[My