天天看點

mysql如何修改列的位元組_Mysql 學習之 mysql 列類型和占用的位元組數

Mysql中的列類型有三大類:數值類、字元類和日期/時間類

數值類分整數型和浮點型兩大類

整數型:

列名取值範圍占用位元組數

TINYINT非常小的正整數,帶符号:-128~127,不帶符号0~255占用1位元組

SMALLINT      小整數,帶符号:-32768~32767不帶符号:0~65535占用2位元組MEDIUMINT中等大小的整數  帶符号:-8388608~8388607,不帶符号:0~16777215占用3位元組

INT标準整數,帶符号:-2147483648~2147483647,不帶符号:0~4294967295占用4位元組

BIGINT大整數,帶符号:-9223372036854775808~9233372036854775807,不帶符号:0~18446744073709551615占用8位元組

浮點型

FLOAT單精度浮點數,最小非零值:+-1.175494351E-38,最大非零值:+-3.402823466E+38占用4位元組

DOUBLE雙精度浮點數,最小非零值:+-2.2250738585072014E-308,最大非零值:+-1.7976931348623157E+308占用8位元組

DECIMAL(M,D)M+2位元組 以字元串形式表示的浮點數,它的取值範圍可變,由M和D的值決定

注意:

1.如何區分帶符号和不帶符号

Mysql中在定義列類型的時候,在整數型資料列後加上一個關鍵字unsigned是禁止負數,取值從0開始

2.簡單解釋下占用位元組數和取值範圍的關系

使用TINYINT來簡單描述下,因為TINYINT占用一位元組,也就是8位

即:0000 0000~~~    1111 1111

0~~~      (128+64+32+16+8+4+2+1)=255,2^8 -1

這個是不帶符号的,有unsigned屬性的

什麼是帶符号的,在計算機中,計算機為了表示一個負數,會把最左側的0或1當做符号訓示符,0代表正數,1代表負數

0 000 0000 正數

1 111 1111 負數

負數的值=絕對值位- 128

假設  1 111 1111這個代表的是負數,絕對值是2^7-1絕對值是127,再減去128得-1

1 000 0000 代表的負數,絕對值 是0,減去128,得-128

是以,負數的取值範圍就是 -128 --> 127

也是二進制的補碼計算,利用檢視下二進制補碼的資料進一步學習

更主要的知道tinyint的取值範圍-128~127,0~255占用1位元組就好了,假設說有一個age字段,一般人的年齡在0~120歲,使用tinyint是最恰當的

3.數值類型顯示寬度問題,在聲明數值列類型時,可以顯式的聲明列的顯示寬度,如int(5)指定顯示寬度為5,這個值并不會限定取值範圍和占用的空間,如果沒有指定這個值的話,預設的顯示為10,占用的位元組還是4位元組!如果你指定的int(5)的話,但你的值為2的話,前面是用0來補充,也就是顯示00002,這個值必須要與zerofill結合時候的才能顯示出這樣的效果!

4.浮點類型也有M(1~255)和D(1~30,且不能大于M-2)。分别表示顯示寬度和小數位數。M和D在FLOAT和DOUBLE中是可選的,預設,當MySQL版本大于3.23.6時,FLOAT和DOUBLE類型将被儲存為硬體所支援的最大精度。DECIMAL的M和D值在MySQL3.23.6後可選,預設D值為0,M值為10

5.DECIMAL與FLOAT和DOUBLE的差別是:DECIMAL類型的值是以字元串的形式被儲存起來的,它的小數位數是固定的。它的優點是,不會象FLOAT和DOUBLE類型資料列那樣進行四舍五入而産生誤差,是以很适合用于财務計算;而它的缺點是:由于它的存儲格式不同,CPU不能對它進行直接運算,進而影響運算效率。DECIMAL(M,D)總共要占用M+2個位元組。

簡單描述下數值列類型的屬性:

ZEROFILL屬性适用于所有數值類資料列類型,作用是,如果數值的寬度小于定義的顯示寬度,則在數值前填充0,使用這個屬性就表示你的數值列類型是無符号的,自動添加了unsigned屬性

UNSIGNED屬性不允許資料列出現負數。

AUTO_INCREMENT屬性可生成獨一無二的數字序列。隻對整數類的資料列有效。

NULL和NOT NULL屬性設定資料列是否可為空。

DEFAULT屬性可為資料列指定預設值

二:字元類

CHAR(M)  固定長度,占用M位元組數,M的範圍是0~255

VARCHAR(M)  可變長度,M位元組,L+1位元組,M的範圍是0~65535用一個位元組或兩個位元組長的字首+資料。如果VARCHAR列聲明的長度大于255,長度字首是兩個位元組。

TINYBLOD,TINYTEXT   2^8-1位元組L+1位元組

BLOB,TEXT 2^16-1位元組L+2位元組

MEDIUMBLOB,MEDIUMTEXT 2^24-1位元組L+3

LONGBLOB,LONGTEXT 2^32-1位元組L+4

ENUM('value1','value2',...) 65535個成員1或2位元組

SET('value1','value2',...) 64個成員1,2,3,4或8位元組

注意:

1.L+1、L+2是表示資料列是可變長度的,它占用的空間會根據資料行的增減面則改變。資料行的總長度取決于存放在這些資料列裡的資料值的長度。L+1或L+2裡多出來的位元組是用來儲存資料值的長度的。在對長度可變的資料進行處理時,MySQL要把資料内容和資料長度都儲存起來。

2.ENUM和SET類型的資料列定義裡有一個清單,清單裡的元素就是該資料列的合法取值。如果試圖把一個沒有在清單裡的值放到資料列裡,它會被轉換為空字元串(“”)。

3.在mysql 5.1版本後,varchar(20) 占用20個位元組,是20個字元、20個漢字、20個數字,并不是一位元組等于2字的算法

三:日期/時間類

DATE 1000-01-01~9999-12-31 3位元組(MySQL3.23版以前是4位元組) 0000-00-00

TIME -838:59:59~838:59:59 3位元組00:00:00

DATETIME 1000-01-01 00:00:00~9999-12-31 23:59:59 8位元組0000-00-00 00:00:00

TIMESTAMP 19700101000000~2037年的某個時刻4位元組00000000000000

YEAR YEAR(4):1901~2155 YEAR(2):1970~2069 1位元組0000

MySQL總是把日期和日期裡的年份放在最前面,按年月日的順序顯示。

DATE、TIME和DATATIME類型分别存放日期值、時間值、日期和時間值的組合。它們的格式分别是“CCYY-MM-DD”、“hh:mm:ss”、“CCYY-MM-DD hh:mm:ss”。

TIMESTAMP資料列的格式是CCYYMMDDhhmmss,取值範圍從19700101000000開始,即1970年1月1号,最大到2037年。它的特點是能把資料行的建立或修改時間記錄下來,如果說你設計的表中有一個字段是計算登入時間的,可以考慮使用這個日期類型

YEAR

YEAR是一種單位元組的資料列類型,YEAR(4)的取值範圍是1901~2155,YEAR(2)的取值範圍是1970~2069,但隻顯示最後兩位數。MySQL能自動把兩位數字年份轉換成四位數字的年份,如97和14分被轉換成1997和2014。轉換規則是這樣的:

年份值00~69将被轉換成2000~2069;

年份值70~99将被轉換成1970~1999。

00被轉換成0000,而不是2000。因為數值00也就是0,而0值是YEAR的一個合法取值。