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,獨立出來一張表,用主鍵來對應,避免影響其它字段索引效率。