2Python全棧之路系列之MysQl基本數據類型

Python全棧之路系列之MySQL基本數據類型


MySQL中定義數據字段的類型對你數據庫的優化是非常重要的。

MySQL支持多種類型,大致可以分爲三類:

  1. 數字類型

  2. 日期和時間類型

  3. 字符串類型


數字類型

類型大小用途
BIT-二進制
TINYINT1字節小整數值
INT or INTEGER4字節大整數值
BIGINT8字節極大整數值
DECIMAL對DECIMAL(M,D) ,如果M>D,爲M+2否則爲D+2小數值
FLOAT4字節單精度浮點數值
DOUBLE8字節雙精度浮點數值
BOOL, BOOLEAN-布爾值
  • BIT[(M)]

二進制位(101001),m表示二進制位的長度(1-64),默認m=1

  • TINYINT[(M)] [UNSIGNED] [ZEROFILL]

小整數,數據類型用於保存一些範圍的整數數值範圍:

範圍(有符號)範圍(無符號)
-128 to 1270 to 255

特別的: MySQL中無布爾值,使用tinyint(1)構造。

  • INT[(M)] [UNSIGNED] [ZEROFILL]

整數,數據類型用於保存一些範圍的整數數值範圍:

範圍(有符號)範圍(無符號)
-2147483648 to 21474836470 to 4294967295

整數類型中的m僅用於顯示,對存儲範圍無限制。例如: int(5),當插入數據2時,select時數據顯示爲:00002

  • BIGINT[(M)] [UNSIGNED] [ZEROFILL]

大整數,數據類型用於保存一些範圍的整數數值範圍:

範圍(有符號)範圍(無符號)
-9223372036854775808 to 92233720368547758070 to 18446744073709551615
  • DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]

準確的小數值,m是數字總個數(負號不算),d是小數點後個數。 m最大值爲65,d最大值爲30。

特別的:對於精確數值計算時需要用此類型decaimal能夠存儲精確值的原因在於其內部按照字符串存儲。

  • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

單精度浮點數(非準確小數值),m是數字總個數,d是小數點後個數。

  • 無符號:
    -3.402823466E+38 to -1.175494351E-38,
    0
    1.175494351E-38 to 3.402823466E+38

  • 有符號:
    0
    1.175494351E-38 to 3.402823466E+38

數值越大,越不準確

  • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

雙精度浮點數(非準確小數值),m是數字總個數,d是小數點後個數。

  • 無符號:
    -1.7976931348623157E+308 to -2.2250738585072014E-308
    0
    2.2250738585072014E-308 to 1.7976931348623157E+308

  • 有符號:
    0
    2.2250738585072014E-308 to 1.7976931348623157E+308

數值越大,越不準確

  • BOOL, BOOLEAN

這些類型是TINYINT的同義詞。零值被認爲是假的。非零值被認爲是正確的:

mysql> SELECT IF(0, 'true', 'false');
+------------------------+
| IF(0, 'true', 'false') |
+------------------------+
| false                  |
+------------------------+
1 row in set (0.00 sec)
mysql> SELECT IF(1, 'true', 'false');
+------------------------+
| IF(1, 'true', 'false') |
+------------------------+
| true                   |
+------------------------+
1 row in set (0.00 sec)
mysql> SELECT IF(2, 'true', 'false');
+------------------------+
| IF(2, 'true', 'false') |
+------------------------+
| true                   |
+------------------------+
1 row in set (0.00 sec)

然而,真假的值僅僅是爲了分別爲1和0,別名,如下所示:

mysql> SELECT IF(0 = FALSE, 'true', 'false');
+--------------------------------+
| IF(0 = FALSE, 'true', 'false') |
+--------------------------------+
| true                           |
+--------------------------------+
1 row in set (0.01 sec)
mysql> SELECT IF(1 = TRUE, 'true', 'false');
+-------------------------------+
| IF(1 = TRUE, 'true', 'false') |
+-------------------------------+
| true                          |
+-------------------------------+
1 row in set (0.00 sec)
mysql> SELECT IF(2 = TRUE, 'true', 'false');
+-------------------------------+
| IF(2 = TRUE, 'true', 'false') |
+-------------------------------+
| false                         |
+-------------------------------+
1 row in set (0.00 sec)
mysql> SELECT IF(2 = FALSE, 'true', 'false');
+--------------------------------+
| IF(2 = FALSE, 'true', 'false') |
+--------------------------------+
| false                          |
+--------------------------------+
1 row in set (0.00 sec)

時間類型

表示時間值的日期和時間類型爲DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每個時間類型有一個有效值範圍和一個”零”值,當指定不合法的MySQL不能表示的值時使用”零”值。

類型大小(字節)格式用途
DATE3YYYY-MM-DD日期值
DATETIME8YYYY-MM-DD HH:MM:SS混合日期和時間值
TIMESTAMP8YYYYMMDD HHMMSS混合日期和時間值,時間戳
TIME3HH:MM:SS時間值或持續時間
YEAR1YYYY年份值
類型範圍
DATE'1000-01-01' to '9999-12-31'
DATETIME'1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'
TIMESTAMP'1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999'
TIME'-838:59:59.000000' to '838:59:59.000000'
YEAR1901 to 2155

字符串類型

類型大小(字節)用途
CHAR(M)0 to 255固定長度的字符串,即使數據小於M長度,也會佔用M長度
VARCHAR(M)0 to 65535一個可變長度的字符串,M表示在字符的最大列長度
TEXT[(M)]0 to 65535長文本列
MEDIUMTEXT0 to 16777215中等長度文本列
LONGTEXT4294967295 or 4GB極大文本列
ENUM('value1','value2',...)
枚舉類型
SET('value1','value2',...)
集合類型
  • VARCHAR(M)注

雖然VARCHAR(M)使用起來較爲靈活,但是從整個系統的性能角度來說,CHAR(M)數據類型的處理速度更快,有時甚至可以超出VARCHAR(M)處理速度的50%。因此,用戶在設計數據庫時應當綜合考慮各方面的因素,以求達到最佳的平衡

  • ENUM('value1','value2',...)

CREATE TABLE shirts (
    name VARCHAR(40),
    size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);

INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),
  ('polo shirt','small');
  
mysql> SELECT name, size FROM shirts WHERE size = 'medium';
+---------+--------+
| name    | size   |
+---------+--------+
| t-shirt | medium |
+---------+--------+
1 row in set (0.00 sec)

UPDATE shirts SET size = 'small' WHERE size = 'large';
COMMIT;
  • SET('value1','value2',...)

SET是一個字符串對象,它可以有0更多個值,每個值均必須選自一個允許值列表中,該列表在表創建時被指定。

mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> SELECT col FROM myset;
+------+
| col  |
+------+
| a,d  |
| a,d  |
| a,d  |
| a,d  |
| a,d  |
+------+
5 rows in set (0.00 sec)

參考:

  1. http://www.cnblogs.com/wupeiqi/articles/5713315.html

  2. http://www.runoob.com/mysql/mysql-data-types.html

  3. http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html

#Python全棧之路


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章