MySQL基礎(三)
資料型別
MySQL的資料型別主要有:
(1)數值型別:
整數型別,如 TINYINT
(很小的整數,佔1個位元組),SMALLINT
(小的整數,佔2個位元組),DEDIUMINT(
中等大小的整數,佔3個位元組),INT
(普通整數,佔4個位元組),BIGINT
(大整數,佔8個位元組)。
浮點小數型別,如 FLOAT
(單精度浮點數,佔4個位元組), DOUBLE
(雙精度浮點數,佔8個位元組), DECIMAL
(定點型別,大小為M+2,M為總共的位數)。
(2)日期/時間型別:
包括:YESR,TIME,DATE,DATETIME,TIMESTAMP。
(3)字串型別:
包括: CHAR,VARCHAR,BINARY,VARBINARY,BLOB,TEXT,ENUM,SET。字串型別又分為文字字串和二進位制字串。
1. 整數型別的顯示寬度
宣告一個INT
型別的欄位:
id INT(11);
該欄位的型別為INT(11)
,括號中的“11”表示該資料型別指定的顯示寬度,即指定能夠顯示的數值中數字的個數。
注意,顯示寬度和資料型別的取值範圍無關,顯示寬度只是用於指明最大可能顯示的數字個數,並不能限制取值範圍和佔用空間。數值的位數小於指定的寬度時,會由空格填充;如果插入的數值大於指定的寬度,只要該值不超過該型別整數的取值範圍,依然可以插入,而且能夠顯示出了。
在不指定顯示寬度的時候,系統會預設顯示寬度:
TINYINT(4)
, SMALLINT(6)
, MEDIUMINT(9)
, INT(11)
, BIGINT(20)
2. 浮點數型別和定點數型別
浮點數和定點數都可以用(M,N)來表示,其中M稱為精度,表示總共的位數,N稱為標度,表示小數的位數。例如(5,3)
表示一共有五位數,其中小數佔3位,如,12.365。
無論是浮點數還是定點數,當用戶指定資料的精度超出精度範圍,就會四捨五入進行處理。例如:宣告如下語句
CREATE TABLE temp1 ( id int primary key auto_increment,x FLOAT(5.1),y DOUBLE(5.1),z DECIMAL(5,1));
向資料表中插入資料
insert into temp1 values(0,1.23,1.69,1.67);
從結果來看,FLOAT
和DOUBLE
型別在四捨五入的時候不會發出警告,而DECIMAL
的數值在截斷的時候回發出警告,但仍然可以操作。
注意,在不指定精度的情況下,FLOAT
和DOUBLE
型別都預設按照實際的精度,而DECIMAL
預設為(10,0),即保留整數。如:
insert into temp1 values(0,1.25,1.64,1.03);
注意,在MySQL中,定點數是以字串的形式儲存的,在對精度要求比較高的時候(如貨幣、科學計數等),需要使用DECIMAL
型別。
兩個浮點數之間應儘量避免進行比較和減法運算。
3. 日期與時間型別
- YEAR YEAR 型別用一個位元組表示年。可以使用以下格式指定YEAR的值。 (1)以4位字串或者4位數字格式表示。例如輸入’1992’或1992. (2)以2位字串格式表示。範圍是’00’~‘99’。‘00’-'69’轉換成2000-2069,‘70’-‘99’轉換成1970-1999.‘0’或‘00’或插入超出取值範圍的值,都將被轉換成2000. (3)以2位數字表示。範圍是1~99.其中1-69,轉換成2001-2069,70-99轉換成1970-1999. 0將被轉換成0000,而不是2000.
- TIME
在儲存時需要3個位元組。格式為‘
HH:MM:SS
’,分別表示時-分-秒。常用的格式為: (1)‘D HH:MM:SS
’格式的字串。D表示日,可以使0-34之間的值。在插入資料庫時,D被轉換為小時儲存,格式為‘D-24+HH
’。並且小時必須是雙位數,小於10的在十位上補0。例如:‘2 10:10’在插入資料庫後為‘58:10’。 (2)‘HHMMSS
’格式的,沒有間隔符的字串,或者‘HHMMSS
’格式的數值。 注意,對於沒有冒號的格式,MySQL在解釋的時候假定最右邊的兩位表示秒,依次往左類推。並且解釋的值表示過去了多少時間,而不是當天的時間。例如: ‘1012’或1012在MySQL中解釋為‘00:10:12’(10分12秒),而不是‘10:12:00’(10時12分)。 對於有冒號的格式,MySQL解釋為當天的時間。例如: ‘10:12’被解釋為‘10:12:00’(10時12分)。 (3)‘0’表示‘00:00:00’。對於超出範圍的資料,不會被插入到資料庫中。 (4)獲取系統當前的時間,可使用如下語句:
INSERT INTO table_name VALUES (CURRENT_TIME) | (NOW());
- DATE
僅有日期,沒有時間部分。儲存需要3個位元組。格式為‘
YYYY-MM-DD
’,分別表示年-月-日。常用的格式如下: (1)‘YYYY-MM-DD
’或‘YYYYMMDD
’字串表示的日期。範圍是‘1000-01-01’-‘9999-12-3’。 (2)‘YY-MM-DD
’或者‘YYMMDD
’字串格式。 (3)‘YY-MM-DD
’或者‘YYMMDD
’數字格式。 (4)插入系統當前日期的語句如下:
INSERT INTO table_name VALUES (CURRENT_DATE | NOW());
4. DATETIME
同時包含日期和時間的資訊。需要8個位元組儲存。格式為:‘YYYY-MM-DD HH:MM:SS
’,表示年-月-日 時:分:秒。輸入格式及獲取當前系統時間同TIME
或DATE
。
5. TIMESTAMP
顯示世界標準時間UTC,顯示格式同DATETIME
,顯示寬度為19個字元,格式為 YYYY-MM-DD HH:MM:SS
,儲存需要4個位元組,範圍為’1970-01-01 00:00:00’UTC - '2038-01-19 03:14:07’UTC。因此插入資料時要保證合法的取值範圍。
注意,DATETIME
與 TIMESTAMP
之間的差異:
DATETIME
在儲存日期資料時,按照實際輸入的格式儲存,即輸入什麼就儲存什麼,與時區無關。
TIMESTAMP
儲存日期時要對當前時區進行轉換,檢索時再轉換回當前時區。即查詢時的時區不同,當前顯示的時間也不同。
4. 文字字串型別
文字字串的資料型別常用的有:
CHAR(M)
固定長度非二進位制字串
VARCHAR(M)
變長度非二進位制字串
TINYTEXT
非常小的非二進位制字串
TEXT
小的非二進位制字串
MEDIUMTEXT
中等大小的非二進位制字串
LONGTEXT
大的非二進位制字串
ENUM
列舉型別,只能有一個列舉字串值
SET
一個設定,字串物件可以有零個或多個SET
成員
CHAR(M)
列長度為M的固定長度的非二進位制字串。在值儲存時,當資料長度小於固定長度時,在右側填充空格以達到指定的長度;在檢索時,當尾部有空格時,會刪除尾部的空格。VARCHAR(M)
實際佔用的空間為字串的實際長度加1.在值儲存和檢索時,尾部的空格被保留。- TEXT 當儲存或查詢TEXT列的值時,不刪除尾部空格。
- ENUM 這是一個字串物件,其值為表建立時在列規定中列舉一列值。語法格式如下:
欄位名 ENUM(‘值1’,‘值2’,…‘值n’)