Float和spa
MySQL將四個字節用於單精度值,並將八個字節用於雙精度值。Float、DOUBLE類型表明近似數值。對於FLOAT,SQL標準容許對FLOAT括號中的關鍵字後面的位以精度(但不容許指數的範圍)進行可選的規範。因爲浮點值是近似值而不是做爲精確值存儲的,所以在比較中嘗試將它們視爲精確值可能會致使問題。它們還受平臺或 實現依賴性的約束。若是須要表示的精確度很高時,如貨幣數據,最好使用decimal。操作系統
DECIMAL對象
DECIMAL以字符串的形式存儲, 可能的最大取值範圍與 DOUBLE 相同,可是有效的取值範圍由 M 和 D 決定。DECIMAL(M,D)若是改變 M 而固定 D,則取值範圍將隨 M 的變大而變大。M的默認值爲10,D的默認值是0.(精確的行爲是特定於操做系統的,可是一般效果是將其截斷爲容許的位數。)blog
例如 decimal(5,2),5是精度,2是小數位數。精度表示值存儲的有效位數,小數位數表示小數點後能夠存儲的位數。因此能夠表示爲123.12排序
浮點數相對於定點數的優勢是在長度必定的狀況下,浮點數可以表示更大的範圍;但缺點是會引發精度問題。而且兩個浮點數進行減法和比較運算時也容易出問題,因此在使用浮點數時須要注意,並儘可能避免作浮點數比較。索引
TIMESTAMP 與 DATETIMEci
TIMESTAMP 與 DATETIME 除了存儲字節和支持的範圍不一樣外,還有一個最大的區別是:DATETIME 在存儲日期數據時,按實際輸入的格式存儲,即輸入什麼就存儲什麼,與時區無關;而 TIMESTAMP 值的存儲是以 UTC(世界標準時間)格式保存的,存儲時對當前時區進行轉換。字符串
BINARY 和 VARBINARYclass
BINARY 和 VARBINARY 相似於 CHAR 和 VARCHAR,不一樣的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節字符串而不是字符字符串。這說明它們沒有字符集,而且排序和比較基於列值字節的數值值。二進制
在將數據轉換爲二進制數據時,SQL Server會對生成的二進制數據進行填充或截斷。
當BINARY被存儲的值,它們被右側填充墊值到指定的長度。填充值爲0x00(零字節)。值在0x00插入時用右填充,不會刪除尾隨字節以進行檢索。全部字節在比較中都很重要,包括ORDER BY和DISTINCT操做。 0x00比較中,空間和空間有所不一樣,0x00先於空間進行 排序。
示例:對於BINARY(3)列, 在插入時'a '變爲 'a \0'。 插入時'a\0'變爲'a\0\0'。兩個插入的值均保持不變以進行檢索。
對於VARBINARY,沒有用於插入的填充,也沒有剝離任何字節以進行檢索。全部字節在比較中都很重要,包括ORDER BY和DISTINCT操做。 0x00比較中,空間和空間有所不一樣,0x00先於空間進行 排序。
對於那些刪除尾部填充字節或比較將其忽略的狀況,若是一列具備要求惟一值的索引,則將僅尾部填充字節數不一樣的值插入該列會致使重複鍵錯誤。例如,若是表包含'a',則嘗試存儲'a\0'會致使重複鍵錯誤。
BLOB
BLOB 是一個二進制大對象,能夠容納可變數量的數據。有 4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區別在於可容納存儲範圍不一樣。