mysql 數值與字符類型 長度梳理
上述表格中的數值類型都是定長的,也就是說,無論你存的數值是多少,多大或者多小,占用的存儲字節大小都是固定的。例如,之前設置的int(1),雖然M值是1個字符,但是它所占用的空間大小永遠都是4個字節的大小,換句話說就是,你可以存入有符號整型從-2 147 483 648到2 147 483 647包括這兩個數的中間任何一個數。int(1)和int(11)占用的是4個字節,可以存入上述這些數,tinyint(1)和tinyint(4)占用的是1個字節,可以存入從-128到127的數。
那麽,這個我們設置tinyint(m),int(m)這個M 指示最大顯示寬度,最大有效顯示寬度是255。顯示寬度與存儲大小或類型包含的值的範圍無關。
該可選顯示寬度規定用於顯示寬度小於指定的列寬度的值時從左側填滿寬度。
顯示寬度並不限制可以在列內保存的值的範圍,也不限制超過列的指定寬度的值的顯示。
但是這個值只有在設置zerofill(表示用0填充)屬性時才有作用。例如我們設置tinyint(2),勾選zerofill屬性,當插入1時,我們查出來的數據會顯示為 01;就是當值的字符數不足m個時,左邊位置會通過補0來湊足m位。
如果為一個數值列指定ZEROFILL,MySQL自動為該列添加UNSIGNED屬性。
接下來,我們再修改一下id1的填充數據類型zerofill(表示用0填充),這裏先知道如何操作即可,我們再從結果得出結論:
需要強調的是,不同的數據類型中的M值意義是不一樣的,我們這裏僅討論整型中的M值。
從上面我們可以得到如下的結論:
1、整數型的數值類型已經限制了取值範圍,有符號整型和無符號整型都有,而M值並不代表可以存儲的數值字符長度,它代表的是數據在顯示時顯示的最小長度;
2、當存儲的字符長度超過M值時,沒有任何的影響,只要不超過數值類型限制的範圍;
3、當存儲的字符長度小於M值時,只有在設置了zerofill用0來填充,才能夠看到效果,換句話就是說,沒有zerofill,M值就是無用的。
而char(m).varchar(m)裏面的m跟數值類型的意義又不一樣
CHAR(M)
固定長度字符串,當保存時在右側填充空格以達到指定的長度。M表示列長度。M的範圍是0到255個字符。當檢索CHAR值時尾部空格被刪除。
如果想要將某個CHAR的長度設為大於255,執行的CREATE TABLE或ALTER TABLE語句將失敗並提示錯誤:
mysql> CREATE TABLE c1 (col1 INT, col2 CHAR(500));
ERROR 1074 (42000): Column length too big for column ‘col‘ (max = 255); use BLOB or TEXT instead
VARCHAR(M)
變長字符串。M 表示最大列長度。M的範圍是0到65,535。(VARCHAR的最大實際長度由最長的行的大小和使用的字符集確定。最大有效長度是65,532字節)。
VARCHAR保存時用一個字節或兩個字節長的前綴+數據。如果VARCHAR列聲明的長度大於255,長度前綴是兩個字節。
值 | char(4) | 存儲需求 | varchar(4) | 存儲需求 |
‘‘ | ‘ ‘ | 4個字節 | ‘‘ | 1個字節 |
‘ab‘ | ‘ab ‘ | 4個字節 | ‘ab‘ | 3個字節 |
‘abcd‘ | ‘abcd‘ | 4個字節 | ‘abcd‘ | 5個字節 |
‘abcdefgh‘ | ‘abcd‘ | 4個字節 | ‘abcd‘ | 5個字節 |
char是一種固定長度的類型,varchar則是一種可變長度的類型,它們的區別是: char(M)類型的數據列裏,每個值都占用M個字節,如果某個長度小於M,MySQL就會在它的右邊用空格字符補足.(在檢索操作中那些填補出來的空格字符將被去掉)在varchar(M)類型的數據列裏,每個值只占用剛好夠用的字節再加上一個用來記錄其長度的字節(即總長度為L+1字節)。
在表結構定義中聲明char和varchar類型時,必須指定字符串的長度.也就是該列所能存儲多少個字符(不是字節,是字符).例如:char(10)和varchar(10)都能存儲10個字符.
存儲固定長度的字符,根據編碼方式不一樣占據的字節也不一樣,通過LENGTH()可以返回字符串所占用的字節數,通過CHAR_LENGTH()返回字符串中的字符數。
①ASCII碼中,一個英文字母(不分大小寫)占一個字節的空間,一個中文漢字占兩個字節的空間。一個二進制數字序列,在計算機中作為一個數字單元,一般為8位二進制數,換算為十進制。最小值0,最大值255。
②UTF-8編碼中,一個英文字符等於一個字節,一個中文(含繁體)等於三個字節。
③Unicode編碼中,一個英文等於兩個字節,一個中文(含繁體)等於兩個字節。
文本符號:英文標點占一個字節,中文標點占兩個字節。舉例:英文句號“.”占1個字節的大小,中文句號“。”占2個字節的大小。
④UTF-16編碼中,一個英文字母字符或一個漢字字符存儲都需要2個字節(Unicode擴展區的一些漢字存儲需要4個字節)。
⑤UTF-32編碼中,世界上任何字符的存儲都需要4個字節。
參考資料 :http://www.mysqlab.net/docs/view/refman-5.1-zh/chapter/column-types.html
mysql 數值與字符類型 長度梳理