2个字节能存多少个16进制_MySql中的varchar长度究竟是字节还是字符
mysql-varchar
在設(shè)計數(shù)據(jù)庫字段的時候,varchar類型,是不是糾結(jié)過到底該設(shè)置為多大呢?
看完這篇文章,你能搞清楚以下問題:
mysql:
1、varchar(100)和varchar(10)的區(qū)別在哪里?
2、varchar能存多少漢字、數(shù)字?
3、varchar的最大長度是多少呢?
4、字符、字節(jié)、位,之間的關(guān)系?
5、mysql字段類型存儲需要多少字節(jié)?
6、varchar(10)能存多少個字符?
1、varchar(100)和varchar(10)的區(qū)別在哪里?一般初學(xué)會認(rèn)為,二者占用的空間是一樣的。比如說我存儲5個char,二者都是實際占用了5個char了【不準(zhǔn)確的想法:varchar在實際存儲的時候會多一個byte用來存放長度】。但是深入一下,設(shè)計數(shù)據(jù)庫的時候,二者一樣嗎?答案是否定的【至少varchar類型需要在數(shù)據(jù)之前利用一個或者兩個字節(jié)來存儲數(shù)據(jù)的長度】并且二者在內(nèi)存中的操作方式也是不同的,下面的例子中有體現(xiàn)如現(xiàn)在用戶需要存儲一個地址信息。根據(jù)評估,只要使用100個字符就可以了。但是有些數(shù)據(jù)庫管理員會認(rèn)為,反正Varchar數(shù)據(jù)類型是根據(jù)實際的需要來分配長度的。還不如給其大一點的呢。為此他們可能會為這個字段一次性分配200個字符的存儲空間。這VARCHAR(100)與VARCHAR(200)真的相同嗎?
結(jié)果是否定的。雖然他們用來存儲90個字符的數(shù)據(jù),其存儲空間相同。但是對于內(nèi)存的消耗是不同的。對于VARCHAR數(shù)據(jù)類型來說,硬盤上的存儲空間雖然都是根據(jù)實際字符長度來分配存儲空間的,但是對于內(nèi)存來說,則不是。其是使用固定大小的內(nèi)存塊來保存值。簡單的說,就是使用字符類型中定義的長度,即200個字符空間。顯然,這對于排序或者臨時表(這些內(nèi)容都需要通過內(nèi)存來實現(xiàn))作業(yè)會產(chǎn)生比較大的不利影響。我這里大概說下:假設(shè)VARCHAR(100)與VARCHAR(200)類型,實際存90個字符,它不會對存儲端產(chǎn)生影響(就是實際占用硬盤是一樣的)。但是,它確實會對查詢產(chǎn)生影響,因為當(dāng)MySql創(chuàng)建臨時表(SORT,ORDER等)時,VARCHAR會轉(zhuǎn)換為CHAR,轉(zhuǎn)換后的CHAR的長度就是varchar的長度,在內(nèi)存中的空間就變大了,在排序、統(tǒng)計時候需要掃描的就越多,時間就越久。
所以如果某些字段會涉及到文件排序或者基于磁盤的臨時表時,分配VARCHAR數(shù)據(jù)類型時仍然不能夠太過于慷慨。還是要評估實際需要的長度,然后選擇一個最長的字段來設(shè)置字符長度。如果為了考慮冗余,可以留10%左右的字符長度。千萬不能認(rèn)為其為根據(jù)實際長度來分配存儲空間,而隨意的分配長度,或者說干脆使用最大的字符長度。
char
1、從碎片角度進(jìn)行考慮,使用CHAR字符型時,由于存儲空間都是一次性分配的。為此某個字段的內(nèi)容,其都是存儲在一起的。單從這個角度來講,其不存在碎片的困擾。而可變長度的字符數(shù)據(jù)類型,其存儲的長度是可變的。當(dāng)其更改前后數(shù)據(jù)長度不一致時,就不可避免的會出現(xiàn)碎片的問題。故使用可變長度的字符型數(shù)據(jù)時,數(shù)據(jù)庫管理員要時不時的對碎片進(jìn)行整理。如執(zhí)行數(shù)據(jù)庫導(dǎo)出導(dǎo)入作業(yè),來消除碎片。2、考慮其長度的是否相近,如果某個字段其長度雖然比較長,但是其長度總是近似的,如一般在90個到100個字符之間,甚至是相同的長度。此時比較適合采用CHAR字符類型。比較典型的應(yīng)用就是MD5哈希值。當(dāng)利用MD5哈希值來存儲用戶密碼時,就非常適和采用CHAR字符類型。因為其長度是相同的。另外,像用來存儲用戶的身份證號碼等等,一般也建議使用CHAR類型的數(shù)據(jù)。另外請大家考慮一個問題,CHAR(1)與VARCHAR(1)兩這個定義,會有什么區(qū)別呢?雖然這兩個都只能夠用來保存單個的字符,但是VARCHAR要比CHAR多占用一個存儲位置。這主要是因為使用VARCHAR數(shù)據(jù)類型時,會多用1個字節(jié)用來存儲長度信息。這個管理上的開銷char字符類型是沒有的。
總結(jié)
二者在磁盤上存儲占的空間是一樣的。區(qū)別有二。第一、一個變長一個固定長度。第二、在內(nèi)存中的操作方式,varchar也是按照最長的方式在內(nèi)存中進(jìn)行操作的。比如說要進(jìn)行排序的時候,varcahr(100)是按照100這個長度來進(jìn)行的。
2、varchar能存多少漢字、數(shù)字?具體還是要看版本的,一個字符占用3個字節(jié) ,一個漢字(包括數(shù)字)占用3個字節(jié)=一個字符
MySQL 4.0版本以下,varchar(100),指的是100字節(jié),如果存放UTF8漢字時,只能存33個(每個漢字3字節(jié))
MySQL 5.0版本以上,varchar(100),指的是100字符,無論存放的是數(shù)字、字母還是UTF8漢字(每個漢字3字節(jié)),都可以存放100個。
UTF8編碼中一個漢字(包括數(shù)字)占用3個字節(jié)
GBK編碼中一個漢字(包括數(shù)字)占用2個字節(jié)
3、varchar的最大長度是多少呢?mysql的vachar字段的類型雖然最大長度是65535,但是并不是能存這么多數(shù)據(jù),最大可以到65533,其中需要1到2個字節(jié)來存儲數(shù)據(jù)長度(如果列聲明的長度超過255,則使用兩個字節(jié)來存儲長度,否則1個)字節(jié),當(dāng)不允許非空字段的時候(因為要用一個字節(jié)來存儲不可為空的標(biāo)識),當(dāng)允許非空字段的時候只能到65532(省下了存儲非空的那個字節(jié))。
行中可以用的字節(jié)數(shù)如下計算:(參考文檔:https://www.jianshu.com/p/ee1e4b14c5e7 )
字段非空時候:varchar(65535) -2 bytes (存儲長度,按2個算) - 1byte (latin1類型) - 1 (null byte)=65531 字節(jié)可以用
減1的原因是實際行存儲從第二個字節(jié)開始’;
字段可以空時候:varchar(65535) -2 bytes (存儲長度,按2個算) - 1byte (latin1類型) =65532 字節(jié)可以用
根據(jù)這個最大字節(jié)數(shù),以及編碼方式,可以計算能存儲的漢字?jǐn)?shù)。
4、字符、字節(jié)、位,之間的關(guān)系?
1、位:數(shù)據(jù)存儲的最小單位。每個二進(jìn)制數(shù)字0或者1就是1個位;2、字節(jié):8個位構(gòu)成一個字節(jié);
即:1 byte (字節(jié))= 8 bit(位);
1 KB = 1024 B(字節(jié));1 MB = 1024 KB; (2^10 B)1 GB = 1024 MB; (2^20 B)1 TB = 1024 GB; (2^30 B)
3、字符:
a、A、中、+、*、の……均表示一個字符;一般 utf-8 編碼下,一個漢字 字符 占用 3 個 字節(jié);數(shù)字屬于漢字,和漢字占用一樣字節(jié)。一般 gbk 編碼下,一個漢字 字符 占用 2 個 字節(jié);
5、mysql字段類型存儲需要多少字節(jié)?
字段類型:TINYINT----一個很小的整數(shù)。有符號的范圍是-128到127,無符號的范圍是0到255。
SMALLINT-----一個小整數(shù)。有符號的范圍是-32768到32767,無符號的范圍是0到65535。
MEDIUMINT----一個中等大小整數(shù)。有符號的范圍是-8388608到8388607,無符號的范圍是0到16777215。
INT----一個正常大小整數(shù)。有符號的范圍是-2147483648到2147483647,無符號的范圍是0到4294967295。
INTEGER-----INT的一個同義詞。
BIGINT-------一個大整數(shù)。有符號的范圍是-9223372036854775808到9223372036854775807,無符號的范圍是0到18446744073709551615。
FLOAT------一個小(單精密)浮點數(shù)字。不能無符號。允許的值是-3.402823466E+38到-1.175494351E-38,0 和 1.175494351E-38到3.402823466E+38。M是顯示寬度而D是小數(shù)的位數(shù)。沒有參數(shù)的FLOAT或有<24 的一個 參數(shù)表示一個單精密浮點數(shù)字。
DOUBLE------一個正常大小(雙精密)浮點數(shù)字。不能無符號。允許的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。
DOUBLE PRECISION、REAL[(M,D)] [ZEROFILL] 這些是DOUBLE同義詞。
DECIMAL------一個未壓縮(unpack)的浮點數(shù)字。不能無符號。行為如同一個CHAR列:“未壓縮”意味著數(shù)字作為一個字符串被存儲,值的每一位使用一個字符。
NUMERIC----- 這是DECIMAL的一個同義詞。
DATE -------一個日期。支持的范圍是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式來顯示DATE值,但是允許你使用字符串或數(shù)字把值賦給DATE列。
DATETIME -------一個日期和時間組合。支持的范圍是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL以'YYYY-MM-DD HH:MM:SS'格式來顯示DATETIME值,但是允許你使用字符串或數(shù)字把值賦給DATETIME的列。
TIMESTAMP------一個時間戳記。范圍是'1970-01-01 00:00:00'到2037年的某時。一個TIMESTAMP列對于記錄一個INSERT或UPDATE操作的日期和時間是有用的,你以可以通過賦給它一個NULL值設(shè)置它為當(dāng)前的日期和時間。
TIME -----一個時間。范圍是'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式來顯示TIME值,但是允許你使用字符串或數(shù)字把值賦給TIME列。
YEAR-----一個2或4位數(shù)字格式的年(缺省是4位)。允許的值是1901到2155,和0000(4位年格式),如果你使用2位,1970-2069( 70-69)。MySQL以YYYY格式來顯示YEAR值,但是允許你把使用字符串或數(shù)字值賦給YEAR列。(YEAR類型在MySQL3.22中是新類型。)
CHAR------一個定長字符串,當(dāng)存儲時,總是是用空格填滿右邊到指定的長度。M的范圍是 1——255 個字符。當(dāng)值被檢索時,空格尾部被刪除。CHAR值根據(jù)缺省字符集以大小寫不區(qū)分的方式排序和比較,除非給出BINARY關(guān)鍵詞。NATIONAL CHAR(短形式NCHAR)是ANSI SQL的方式來定義CHAR列應(yīng)該使用缺省字符集。這是MySQL的缺省。CHAR是CHARACTER的一個縮寫。
VARCHAR------一個變長字符串。注意:當(dāng)值被存儲時,尾部的空格被刪除(這不同于ANSI SQL規(guī)范)。M的范圍是 1——65532 個字符,1個或2個字節(jié)用來保存字符串長度。VARCHAR值根據(jù)缺省字符集以大小寫不區(qū)分的方式排序和比較,除非給出BINARY關(guān)鍵詞值。VARCHAR是CHARACTER VARYING一個縮寫。
TINYBLOB 、TINYTEXT 一個BLOB或TEXT列,最大長度為255(2^8-1)個字符
BLOB 、TEXT -----一個BLOB或TEXT列,最大長度為65535(2^16-1)個字符
MEDIUMBLOB、MEDIUMTEXT ------一個BLOB或TEXT列,最大長度為16777215(2^24-1)個字符
LONGBLOB 、LONGTEXT ------一個BLOB或TEXT列,最大長度為4294967295(2^32-1)個字符
ENUM-----枚舉。一個僅有一個值的字符串對象,這個值式選自與值列表'value1'、'value2', ...,或NULL。一個ENUM最多能有65535不同的值。
SET-----一個集合。能有零個或多個值的一個字符串對象,其中每一個必須從值列表'value1', 'value2', ...選出。一個SET最多能有64個成員。
總結(jié)
以上是生活随笔為你收集整理的2个字节能存多少个16进制_MySql中的varchar长度究竟是字节还是字符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是URL百分号编码?
- 下一篇: 卢伟冰:红米Note系列全球累计销量超3