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