1. 程式人生 > >MySQL中的資料型別

MySQL中的資料型別

MySQL支援多種資料型別,主要有數值型別、日期/時間型別和字串型別。

一、數值型別

數值型別包括:

  • 整數型別:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮點數型別有FLOAT和DOUBLE,定點小數型別DECIMAL。
  • 日期/時間型別:包括YEAR、TIME、DATE、DATATIME和TIMESTAMP。
  • 字串型別:CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等。字串型別又分為文字字串和二進位制字串。

1.整數型別

數值型資料型別主要用來儲存數字,不同的資料型別提供不同的取值範圍,可以儲存的值的範圍越大,其所需要的儲存空間也會越大。整數型別的欄位可以新增AUTO_INCREMENT

自增約束條件。

型別名稱 儲存需求(B)
TINYINT 1
SMALLINT 2
MEDIUMINT 3
INT 4
BIGINT 8

需要注意的是,在設計資料庫的時候,在實體類中long型的變數對應BIGINT,INT對應int型別的成員變數。
例:

CREATE TABLE tb_emp1
(
id INT(11),
name VARCHAR(25).
deptId INT(11),
salary FLOAT
);

id欄位的資料型別為INT(11),“11”表示該資料型別指定的顯示寬度,指定能顯示的數值中數字的個數。
注意:顯示寬度和資料型別的取值範圍是無關的。

顯示寬度只是指明MySQL最大可能顯示的數字個數,數值的位數小於指定寬度時會有空格填充。但是,如果插入了大於顯示寬度的值,只要該值不超過取值範圍,數值依然可以插入,而且在查詢該列值的時候,將會顯示完整的插入值,而不會進行顯示寬度處理。例如下列語句建立表user:

mysql> CREATE TABLE user
    -> (
    -> id INT(4),
    -> name VARCHAR(20)
    -> );

插入資料:

mysql> INSERT INTO user VALUES(19999,'qing');

查詢結果顯示:

+-------+------+
| id    | name |
+-------+------+
| 19999 | qing |
+-------+------+

INT預設顯示4,但是插入19999依然正常顯示。請牢記:INT(3)中的數字3僅僅限制顯示而已。

2.浮點數型別和定點數型別

浮點型別有2中:單精度(FLOAT)和雙精度(DOUBLE)。定點型別只有DECIMAL。二者都可以用(M,D)來表示,其中M稱為精度,表示總的位數,D稱為標度,表示小數點後的位數。

型別名稱 儲存需求(B)
FLOAT 4
DOUBLE 8
DECIMAL(M,D) M+2

DECIMAL型別不同於FLOAT和DOUBLE,DECIMAL型別實際上是以串存放的。
不論是定點型別還是浮點型別,如果使用者指定的資料超出精度範圍,則會進行四捨五入處理。

  • 問:如果不指定精度,系統如何處理?
  • 答:FLOAT和DOUBLE在不指定精度的時候,預設按照實際的精度(由計算機硬體和作業系統決定),DECIMAL預設為(10,0)。

二、日期與時間型別

這裡只是簡單說一下DATE和TIMESTAMP型別:

型別名稱 日期格式 儲存空間(B)
DATE YYYY-MM-DD 3
TIMESTAMP YYYY-MM-DD HH:MM:SS 4
  • 使用CURRENT_DATE或者NOW()插入當前系統日期。
  • 應該注意的是,CURRENT_DATE只返回當前日期值,不包括時間部分;NOW()函式返回日期和時間,但是在儲存到資料庫時,只保留其日期部分。

TIMESTAMP型別顯示寬度固定在19個字元,且其值的儲存是以UTC(世界標準時間)格式儲存的,儲存時間時對當前時區進行轉換,檢索時再次進行轉換。即查詢時,當前時區不同,顯示的時間值是不同的。

三、文字字串型別

字串型別用來儲存字串資料,也可以用來儲存其他資料,比如圖片和音訊的二進位制資料等等。
文字字串分為兩類:

  • 文字字串
  • 二進位制字串

MySQL中文字字串資料型別

型別名稱 說明 儲存需求
CHAR(M) 固定長度的非二進位制字串 M位元組,1<=M<=255
VARCHAR(M) 變長的非二進位制字串 L+1位元組,這裡L<=M和1<=M<=255
ENUM 列舉型別,只能有一個列舉字串值 1或2個位元組,取決於列舉值的數目(最大值是65535)
SET 一個設定,字串物件可以有零個或多個SET成員 1,2,3,4或8個位元組,取決於集合成員的數量(最多64個成員)
TINYTEXT 非常小的非二進位制字串 L+1個位元組,這裡L<28
TEXT 小的非二進位制字串 L+2個位元組,這裡L<2^\{16}
MEDIUMTEXT 中等大小的非二進位制字串 L+3個位元組,這裡L<2^\{24}
LONGTEXT 大的非二進位制字串 L+4個位元組,這裡L<2^\{32}

上面幾種資料型別,我們著重說一下CHAR和VARCHAR,ENUM,SET
CHAR(M)為固定長度的字串,定義時指定字串列長,儲存時右側填充空格以達到指定長度。M表示列長度,M的範圍是0-255個字元。檢索時,尾部的空格將會被刪除。如果存入了一個超過M長度的字串,會導致該字串被截斷,只保留前M位。

VARCHAR(M)是長度可變的字串,M表示最大列的長度。M的範圍是0-65535。

例如,VARCHAR(50) 定義了一個最大長度為50的字串,如果輸入的字串只有10個字元,那麼只需要實際儲存的是10個字元和一個長度資訊字元。VARCHAR在值儲存和值檢索的時候,空格儲存。

看下面的例子:

mysql> create table tmp8
    -> (
    -> ch CHAR(4),varch VARCHAR(4)
    -> );

mysql> INSERT INTO tmp8('ab  ','ab  ');

mysql> SELECT concat('(',ch,')'),concat('(',varch,')') FROM tmp8;
+--------------------+-----------------------+
| concat('(',ch,')') | concat('(',varch,')') |
+--------------------+-----------------------+
| (ab)               | (ab  )                |
+--------------------+-----------------------+
1 row in set (0.02 sec)

從上面可以看出,檢索時,CHAR型會刪掉尾部的空格,而VARCHAR不會。

ENUM型別:

來個實際的例子:

mysql> CREATE TABLE tmp9
    -> (
    -> name CHAR(4),
    -> sex ENUM('male','female')
    -> );
Query OK, 0 rows affected (0.33 sec)

mysql> DESC tmp9;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| name  | char(4)               | YES  |     | NULL    |       |
| sex   | enum('male','female') | YES  |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> INSERT INTO tmp9 VALUES('aaaa','male');
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO tmp9 VALUES('bbbb','female');
Query OK, 1 row affected (0.07 sec)

mysql> SELECT sex,sex+0 FROM tmp9;
+--------+-------+
| sex    | sex+0 |
+--------+-------+
| male   |     1 |
| female |     2 |
+--------+-------+
2 rows in set (0.00 sec)

mysql> INSERT INTO tmp9 VALUES('bbbb',NULL);
Query OK, 1 row affected (0.06 sec)

mysql> SELECT sex,sex+0 FROM tmp9;
+--------+-------+
| sex    | sex+0 |
+--------+-------+
| male   |     1 |
| female |     2 |
| NULL   |  NULL |
+--------+-------+
3 rows in set (0.00 sec)

從上面我們可以看到,資料庫中儲存的是ENUM型別資料的索引值。
另外,如果ENUM列總有一個預設值,如果該列可以為NULL,那麼預設值為NULL,如果NOT NULL,那麼為允許列表中的第一個值。

SET型別:

SET也是一個字串物件,不過跟ENUM不同的是,SET型別的欄位可以取 SET列表中的0個或者多個值。SET列最多有64個成員。
如果插入的的值有重複,那麼MySQL會自動刪除重複的值,插入SET欄位的值的順序並不重要,MySQL在儲存的時候,會按照定義的順序顯示;如果插入不正確的值,MySQL會阻止插入。

mysql> CREATE TABLE tmp10
    -> (
    -> se SET('A','C','X','D')
    -> );
Query OK, 0 rows affected (0.30 sec)
mysql> INSERT INTO tmp10 VALUES('A,D,X');
Query OK, 1 row affected (0.11 sec)

mysql> SELECT * FROM tmp10;
+-------+
| se    |
+-------+
| A,X,D |
+-------+
1 row in set (0.00 sec)

注意A,X,D的順序,是和建立表時的順序一樣的。