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