前面的講解中已經接觸到了表的創建,表的創建是對字段的聲明,比如:
上述語句聲明瞭字段的名稱、類型、所佔空間、默認值 和是否可以為空等信息。其中的 int、varchar、char 和 decimal 都是 MySQL 所支持的數據類型,本節將詳細介紹 MySQL 支持的數據類型。
MySQL 中定義數據字段的類型對數據庫的優化非常重要。MySQL中的每種數據類型都可以通過以下特徵來確定:
- 它用來表示數據值。
- 佔用的空間以及值是固定長度還是可變長度。
- 數據類型的值可以被索引。
- MySQL如何比較特定數據類型的值。
MySQL 支持的數據類型可以分為三類:數值、日期/時間和字符串(字符)類型,另外還有
空間數據類型和JSON數據類型,本節以前三種數據類型為主,最後兩種簡單介紹一下。1、數值類型
MySQL支持所有標準SQL數值數據類型。
這些類型包括嚴格數值數據類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值數據類型(FLOAT、REAL和DOUBLE PRECISION)。
關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。
作為SQL標準的擴展,MySQL也支持整數類型TINYINT、MEDIUMINT和BIGINT。下面的表顯示了需要的每個整數類型的存儲和範圍。
1.1 整形數值
以 TINYINT 為例詳細介紹整形數值型的一些屬性及操作。
TINYINT[(M)]\[UNSIGNED][ZEROFILL]
M表示每個值的位數,此處為顯示的位數,並不是佔用字節大小。該可選顯示寬度規定用於顯示寬度小於指定的列寬度的值時從左側填滿寬度。當結合可選擴展屬性ZEROFILL使用時, 默認補充的空格用零代替。例如,對於聲明為INT(5) ZEROFILL的列,值5檢索為00005。
注意:M 要與 ZEROFILL 配合使用才有效果。
如果一個數值列指定為 ZEROFILL, MySQL自動為該列添加 UNSIGNED 屬性。
1.2 浮點型數值
對於浮點列類型,在MySQL中單精度值使用4個字節,雙精度值使用8個字節。
DOUBLE\[(M,D)]\[UNSIGNED][ZEROFILL]
- M:精度,代表“總位數”;
- D:標度,代表小數位(小數點右邊的位數)
1.3 布爾值
MySQL 沒有內置的 BOOLEAN 或 BOOL 數據類型,使用最小的整數類型,也就是 TINYINT(1)來表示。
2、日期和時間類型
表示時間值的日期和時間類型為 DATETIME、
DATE、TIMESTAMP、TIME 和 YEAR。每個時間類型有一個有效值範圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。
TIMESTAMP 類型有專有的自動更新特性,將在後面描述。
注意:
- 包含兩位數年份值的日期是不明確的,因為世紀是未知的,MySQL 使用如下規則解釋兩位數的年份值:
- 年份值在70~99之間轉換為1970~1999
- 年份值在00~69之間轉換為2000~2069
- 通過連接器/ODBC使用的“零”值日期或時間值將自動轉換為NULL,因為ODBC無法處理這些值。
3、字符串類型
在MySQL中,字符串可以容納從純文本到二進制數據(如圖像或文件)的任何內容。 字符串類型指 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
3.1 CHAR 和 VARCHAR
CHAR 和 VARCHAR 類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進行大小寫轉換。
CHAR和VARCHAR類型聲明時需要一個長度值,該值表示你想要想要存儲的字符的最大數量。例如,CHAR(30)可以容納30個字符。 CHAR 列的寬度在創建表時已經固定下來了,如果插入記錄該字段的寬度不足指定寬度,那麼要在右側自動填補 空格。檢索CHAR值時,除非啟用 PAD_CHAR_TO_FULL_LENGTH SQL模式,否則將刪除尾部空格。
存儲 VARCHAR 值時,不會填充。在與標準SQL一致的情況下,存儲和檢索值時保留尾部空格。
下表展示了CHAR和VARCHAR之間的差異,它展示了將各種字符串值存儲到CHAR(4)和VARCHAR(4)列的結果(假設此列使用了一個單字節字符集,如latin1)。
請看下面例子:
3.2 BINARY 和 VARBINARY
BINARY 和 VARBINARY 類似於 CHAR 和 VARCHAR,不同的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節字符串而不是字符字符串。這說明它們沒有字符集,並且排序和比較基於列值字節的數值。
3.3 BLOB 和 TEXT
BLOB 是一個二進制大對象,可以容納可變數量的數據。有 4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區別在於可容納存儲範圍不同。四種 TEXT 類型是TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。它們對應於四個 BLOB 類型,並且具有相同的最大長度和存儲要求。
3.4 ENUM 類型
ENUM 是一個字符串對象,它從一個允許值列表中選擇了一個值,這些值在表創建時顯式地列出了列規範中。它有這些優勢:
- 在一列有有限的可能值集合的情況下,壓縮數據存儲。你指定為輸入值的字符串被自動編碼為數字。
- 可讀的查詢和輸出。在查詢結果中,這些數字被轉換回相應的字符串。
枚舉值必須是引用的字符串文字。 你可以這樣用枚舉列創建表:
假如向該表中插入一百萬條 值為 'medium' 的記錄,存儲空間需要一百萬字節。相比而言,如果以字符串 'medium' 存儲,則需要六百萬字節。
3.5 SET 類型
SET 是一個字符串對象,可以有0個或多個值,並且每一個值都必須從表創建時指定的允許值列表中選擇。SET 的列值由多個集合成員組成的,用逗號(,)分隔。這樣的話,SET成員值本身不應該包含逗號。
例如,由 SET('one', 'two') NOT NULL 指定的數據列可以有這些值:
SET 列最多可以包含64個不同的成員。
看如下例子:
從查詢結果可以看出:如果一條記錄裡已經包含 SET 的一個成員了,就不會重複保存該值。
4、空間數據類型
MySQL支持許多包含各種幾何和地理值的空間數據類型,如下表所示:
5、JSON 數據類型
MySQL 支持由 RFC 7159 規定的原生 JSON 數據類型,以更有效地存儲和管理JSON文檔。 本機JSON數據類型提供JSON文檔的自動驗證和最佳存儲格式。 JSON 列不能有默認值。
可以看到,如果我們插入的記錄 JSON 數據格式不正確是不能成功的。
閱讀更多 C與Python實戰 的文章