Mysql資料型別詳解

2022-09-16 00:27:14 字數 4903 閱讀 7578

mysql資料型別包括

1.整數型別,浮點數型別和定點數型別

2.時間和日期型別

3.字串型別

4.二進位制型別

整數型別

標準的sql中支援integer,smallint這兩類整數型別,mysql除了這兩個還有其他的,見下表(1位元組等於8位 2^8=256 2^16=65536...)

型別大小範圍(有符號)範圍(無符號)預設寬度

tinyint

1 位元組

(-128,127)

(0,255)

4smallint

2 位元組

(-32 768,32 767)

(0,65 535)

6mediumint

3 位元組

(-8 388 608,8 388 607)

(0,16 777 215)

8int或integer

4 位元組

(-2 147 483 648,2 147 483 647)

(0,4 294 967 295)

11bigint

8 位元組

(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)

(0,18 446 744 073 709 551 615)

20為什麼tinyint的無符號範圍是(0,255),因為tinyint的佔1個位元組,1個位元組是8位,那麼tinyint無符號數最大值就是28-1,即255,tinyint有符號數最大值是27-1,即127.

同理,其他型別也是這麼算的

mysql支援資料型別的名稱後面顯示寬度,其基本形式為

資料型別(寬度值)

問:為什麼tinyint的預設寬度是4,而不是3,最大值是255嗎?

答:如果是有符號的情況,就會有-128的值,它的寬度是4.

當插入的資料顯示寬度大於設定的顯示寬度時,資料依然可以插入;例如在int(4)中插入111111仍然可以顯示111111,所以顯示寬度並不能限制資料的最大值,資料的最大值是由資料型別決定的,那麼int(4)到底起什麼作用呢。當給字段設定int(4) zerofill時,zerofill引數表示數字不足的顯示空間由0來填補,注意,加上zerofill引數後,欄位將自帶unsigned屬性,只能表示無符號整數

整數型別還有乙個auto_increment屬性,該屬性可以使欄位成為自增字段

浮點型別和定點數型別

mysql中浮點數型別包括float(單精度浮點數),double(雙精度浮點數),decimal(定點數)型別

在mysql中可以指定浮點數和定點數的精度,其基本形式為

資料型別 (m,d) 其中m引數稱為精度,是資料的總長度,小數點不佔位置;d引數稱為標度,是小數點後的位數;例如1234.56這個數的型別應該為float(6,2);

型別大小範圍(有符號)範圍(無符號)用途

float

4 位元組

(-3.402 823 466 e+38,1.175 494 351 e-38),0,(1.175 494 351 e-38,3.402 823 466 351 e+38)

0,(1.175 494 351 e-38,3.402 823 466 e+38)

單精度浮點數值

double

8 位元組

(1.797 693 134 862 315 7 e+308,2.225 073 858 507 201 4 e-308),0,(2.225 073 858 507 201 4 e-308,1.797 693 134 862 315 7 e+308)

0,(2.225 073 858 507 201 4 e-308,1.797 693 134 862 315 7 e+308)

雙精度浮點數值

decimal

對decimal(m,d) ,如果m>d,為m+2否則為d+2

依賴於m和d的值

依賴於m和d的值

小數值上述指定小數精度的方法雖然適合於浮點數和定點數,但不是浮點數的標準用法;建議使用浮點數時,如果不是實際情況需要,最好不要使用浮點數,不然可能會影響資料的遷移;對於定點數而已,decimal是定點數的標準格式,一般情況下可以選擇這種資料型別

ps:所謂浮點數就是小數點後的位數是不定的,浮動的..... 

如果插入值的精度高於實際的精度,系統會自動進行四捨五入處理,例如向float(6,2),double(6,2),decimal(6,2)中分別插入3.143,3.145,3.1435;其結果為3.14,3.15,3.14 ;同時最後乙個型別的資料插入會發出警告;

如果我們不指定型別的精度,浮點數和定點數有其預設的精度,float和double會儲存實際精度,這與系統和硬體精度有關;decimal預設為整數(四捨五入);例如我們插入3.143,3.145,3.5435,顯示結果為3.143,3.145,4;

定點數是以字串形式儲存的

日期和時間型別

型別大小

(位元組)

範圍格式

用途date

41000-01-01/9999-12-31

yyyy-mm-dd

日期值time

3'-838:59:59'/'838:59:59'

hh:mm:ss

時間值或持續時間

year

11901/2155

yyyy

年份值datetime

81000-01-01 00:00:00/9999-12-31 23:59:59

yyyy-mm-dd hh:mm:ss

混合日期和時間值

timestamp

41970-01-01 00:00:00/2038-01-19 11:14:07

yyyy-mm-dd hh:mm:ss

混合日期和時間值,時間戳

其次,timestamp型別在預設情況下,insert、update(如果有更新) 資料時,timestamp型別欄位會自動以當前時間(current_timestamp)填充/更新。

第三,timestamp比較受時區timezone的影響以及mysql版本和伺服器的sql mode的影響

欄位的timestamp型別缺省會補充為timestamp not null default current_timestamp on update current_timestamp

補充:1、timestamp列必須有預設值,預設值可以為「0000-00-00 00:00:00」,但不能為null。

2、timestamp列不可以設定值,只能由資料庫自動去修改。

3、乙個表可以存在多個timestamp列,但只有乙個列會根據資料更新而改變為資料庫系統當前值。因此,乙個表中有多個timestamp 列是沒有意義,實際上乙個表只設定乙個timestamp列。

4、timestamp列的預設值是current_timestamp常量值。當紀錄資料發生變化的時候,timestamp列會自動將其值設定為current_timestamp。

所以一般來說,我比較傾向選擇datetime,至於你說到索引的問題,選擇datetime作為索引,如果碰到大量資料查詢慢的情況,也可以分割槽表解決。

問:為什麼year型別只占用1個位元組

答:year型別的取值範圍是1901到2155和0000,共256種情況,個人認為實際儲存的是0-255的值,前面講過這個範圍正好佔1個位元組

year超出取值訪問的值都為0000

字串型別

字串型別指char、varchar、enum、binary、varbinary、blob、text、enum和set。

型別大小

用途char

0-255位元組

定長字串

varchar

0-65535 位元組

變長字串

enum

0-65535個

tinyblob

0-255位元組

不超過 255 個字元的二進位制字串

tinytext

0-255位元組

短文本字串

blob

0-65 535位元組

二進位制形式的長文字資料

text

0-65 535位元組

長文字資料

mediumblob

0-16 777 215位元組

二進位制形式的中等長度文字資料

mediumtext

0-16 777 215位元組

中等長度文字資料

longblob

0-4 294 967 295位元組

二進位制形式的極大文字資料

longtext

0-4 294 967 295位元組

極大文字資料

char和varchar的區別

char是一種固定長度的型別,varchar則是一種可變長度的型別,它們的區別是:

char(m)型別的資料列裡,每個值都占用m個位元組,如果某個長度小於m,mysql就會在它的右邊用空格字元補足.(在檢索操作中那些填補出來的空格字元將被去掉)在varchar(m)型別的資料列裡,每個值只占用剛好夠用的位元組再加上乙個用來記錄其長度的位元組(即總長度為l+1位元組)

enum列舉型別

基本形式為 屬性名 enum('值1','值2','值n');

enum型別只能取列表中的乙個元素,其取值列表中最多用65535個值,如果enum型別加上了not null屬性,則其預設的值為取值列表中第乙個元素,如果沒加not null,則允許插入null值

Mysql 資料型別詳解

位元組大小 範圍 有符號 範圍 無符號 用途tinyint 1 位元組 最小 128 最大 127 最小 0 最大 255 小整數值 smallint 2 位元組 最小 32768 最大 32767 最小 0 最大 65535 短整數值 mediumint 3 位元組 最小 8388608 最大 8...

MySql資料型別詳解

1.整型 int mysql資料型別 含義tinyint m 1個位元組表示 128 127 smallint m 2個位元組表示 32768 32767 mediumint m 3個位元組表示 8388608 8388607 int m 4個位元組表示 2147483648 2147483647 ...

MySQL資料型別詳解

常見的資料型別 一 整型 tinyint smallint mediumint int integer bigint 位元組數123 48二 小數 float double dec m,d decimal m,d 位元組數488 8decimal 可以簡寫成dec,所以後兩個作用一樣 m 表示總共有...