天天看點

MySQL 資料類型

ZEROFILL——不足指定位數的時候用0補齊

在實際開發中,系統故障産生的成本,遠遠高于添加幾個字段存儲空間産生的成本。

FOLAT和DOUBLE的差別

FLOAT占用位元組少(4位元組),精度低。DOUBLE占用位元組大(8位元組),精度高。

FLOAT(m.d)m為位數,d為小數位數。如:FOLAT(5,2)表示【-999.99,999.99】

小數位超過範圍,則進行四舍五入。

整數位超過範圍則會報錯。

小數位的四舍五入導緻整數位超過範圍也會報錯。

精度情況

浮點數精度不準确。使用定點數DECIMAL(M,N),占用位元組M+2。預設精度(10,0)

同等位元組下,沒有DOUBLE存儲内容多

底層中使用字元串存儲

精度問題

資料需要精準,則使用定點數。浮點數在精度要求不那麼高的情況是使用

YEAR使用四位存儲的方式<code>YEAR(4)</code>

YEAR的範圍是1970-2155

兩位的情況下

0-69指2000年-2069年

70-99指1970年-1999年

DATE格式<code>'YYYY-MM-DD'</code>或者<code>'YY-MM-DD'</code>使用兩位的存儲方式規則同上。

DATETIME 和DATESTAMP

DATETIME需要八個位元組,格式:<code>YYYY-MM-DD HH:MM:SS</code>或者<code>YY-MM-DD HH:MM:SS</code>規則同上。

TIMESTAMP隻需要4個位元組,但是時間的範圍隻能在<code>1970-01-01 00:00:01</code>至<code>2038-01-19 03:14:07</code>

涉及時區之間的操作的适應TIMESTAMP?

TIMESTAMP使用毫秒數進行存儲,讀取時會根據目前時區添加對應的毫秒數(存:東八區,讀:東九區。結果+1h)

開發中使用<code>DATETIM</code>E最多。

CHAR和VARCHAR

CHAR(M)占用M位元組,不滿M也會補滿至M,預設隻有1位元組

VARCHAR(M)占用M+1位元組。VARCHAR必須在定義時寫上寬度。

哪些情況使用 CHAR 或 VARCHAR 更好

類型

特點

空間上

時間上

适用場景

CHAR(M)

固定長度

浪費存儲空間

效率高

存儲不大,速度要求高

VARCHAR(M)

可變長度

節省存儲空間

效率低

非CHAR的情況

開發中經驗:

TEXT文本類型,可以存比較大的文本段,搜尋速度稍慢,是以如果不是特别大的内容,建議使用CHAR,VARCHAR來代替。還有TEXT類型不用加預設值,加了也沒用。而且text和blob類型的資料删除後容易導緻“空洞”,使得檔案碎片比較多,是以頻繁使用的表不建議包含TEXT類型字段,建議單獨分出去,單獨用一個表。

在定義資料類型時,如果确定是<code>整數</code>,就用<code>INT</code>; 如果是<code>小數</code>,一定用定點數類型 <code>DECIMAL(M,D)</code>; 如果是日期與時間,就用 <code>DATETIME</code>。

這樣做的好處是,首先確定你的系統不會因為資料類型定義出錯。不過,凡事都是有兩面的,可靠性好,并不意味着高效。比如,TEXT 雖然使用友善,但是效率不如 CHAR(M) 和 VARCHAR(M)。

關于字元串的選擇,建議參考如下阿裡巴巴的《Java開發手冊》規範:

阿裡巴巴《Java開發手冊》之MySQL資料庫:

任何字段如果為非負數,必須是 UNSIGNED

【<code>強制</code>】小數類型為 DECIMAL,禁止使用 FLOAT 和 DOUBLE。

說明:在存儲的時候,FLOAT 和 DOUBLE 都存在精度損失的問題,很可能在比較值的時候,得到不正确的結果。如果存儲的資料範圍超過 DECIMAL 的範圍,建議将資料拆成整數和小數并分開存儲。

【<code>強制</code>】如果存儲的字元串長度幾乎相等,使用 CHAR 定長字元串類型。

【<code>強制</code>】VARCHAR 是可變長字元串,不預先配置設定存儲空間,長度不要超過 5000。如果存儲長度大于此值,定義字段類型為 TEXT,獨立出來一張表,用主鍵來對應,避免影響其它字段索引效率。