DataType.txt MySql DateType ---------- 20200122 摘要 Type Bytes --------- ----- ------- -------------- ----- TINYINT 1 -128 127 0 255 SMALLINT 2 -32768 32767 0 65535 MEDIUMINT 3 INT 4 BIGINT 8 --------- ----- ------- -------------- ----- FLOAT 4 A precision from 0 to 23 results in a four-byte single-precision FLOAT column DOUBLE 8 A precision from 24 to 53 results in an eight-byte double-precision DOUBLE column. BIT(N) --------- ----- ------- -------------- ----- * REAL 是DOUBLE的別名,但如果設定 REAL_AS_FLOAT 的模式中為 FLOAT 的別名。 * DEC、NUMERIC 是 DECIMAL的別名 * DECIMAL 使用方式: DECIMAL(M,D) => 總共M個數字和D個小數位數;M的範圍是1~65;D的範圍是0~30;且M>=D。 DECIMAL(6,4) => 總共6位數字,含小數點4位,數字範圍 99.9999 ~ -99.9999 * DECIMAL會先運算後四捨五入處理多餘的小數,例如 DECIMAL(3,2) 1+0.005 = 1.01 * 設定超過 DECIMAL長度範圍的值,會出現錯誤 #1425 - Too big scale 48 specified for column 'colname'. Maximum is 30. 小數位數超過30 #1426 - Too big precision 66 specified for column 'colname'. Maximum is 65. 字元數超65 * 如果 update 超過範圍也會出現 #1264 - Out of range value for column 錯誤,不會再出現翻轉的問題 * 變更為DECIMAL類型 ALTER TABLE `test` CHANGE `col` `col` DECIMAL(30.20) NOT NULL DEFAULT '0'; * FLOAT、DOUBLE、DECIMAL使用時機: float 和double型態是使用「近似值」來儲存你的數值,double 比 float 可儲存數值範圍和有效數字較大,儲存空間也大一倍,適合數理計算使用。 decimal 型態就可以用來儲存完全精準的數值,有效數字最多可達65位,最大和最小值比double來得小,適合會計、金融使用。 * 假設我有四個欄位 ABCD,給他們輸入根號2,不同類型的結果: 設定 寫入資料 update `test` set A='1234567890.1234567890123456789012345678901234567890', B='1234567890.1234567890123456789012345678901234567890', C='1234567890.1234567890123456789012345678901234567890', D ='1234567890.1234567890123456789012345678901234567890' 結果 結論 float 最大的問題是有效位數只有7個,其他會亂塞值(磁碟中未清除的位元?),所以只能用在精準度要求不高的地方,避免使用。 double 適合一般般數理運算使用,可以存很大的數字,但有效位數約17個,mysql內建的數學函式也是以此型態作為運算基準 decimal 是精準數值,占用空間比較大,適合算和錢有關的,或是需要存較精準的數字。 Numeric type attributes TYPE(N) Where N is an integer and display width of the type is upto N digits. ZEROFILL The default padding of spaces is replaced with zeros. So, for a column INT(3) ZEROFILL, 7 is displayed as 007. 例如: INT(11) 表示顯示寬度為 11位數, 但仍為 4 BYTES. TYPES FORMAT Range DATETIME YYYY-MM-DD HH:MM:SS '1000-01-01 00:00:00' to '9999-12-31 23:59:59'. DATE YYYY-MM-DD '1000-01-01' to '9999-12-31'. TIMESTAMP YYYY-MM-DD HH:MM:SS '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC String Types Types Range CHAR 0 to 255 VARCHAR 0 to 65535 BINARY 0 to 255 VARBINARY 0 to 65535 BLOB Large binary object that containing a variable amount of data. Values are treated as binary strings.You don't need to specify length while creating a column. TEXT Values are treated as character strings having a character set. TEXT/CHAR/BLOB 文字型態 文字類型 /二進位資料類型 記錄長度位元 最大長度 ------------------------ ------------ ------------------------------------- TINYTEXT /TINYBOLB 1 255 TEXT /BOLB 2 65,535 (65KB) MEDIUMTEXT /MEDIUMBOLB 3 16,777,215(16MB) LONGTEXT /LONGBOLB 4 4GB CHAR /BINARY 1 255 VARCHAR /VARBINARY 2 65,535 255 ( ver.<5.0.3) 5.0.3 ------------------------ ------------ ------------------------------------- * CHAR 固定長度 (0 至 255,預設為 1) 的字串,在儲存長度不足時會自右邊補足空白 * VARCHAR 可變長度 (0-65,535) 的字串,最大的有效長度需視資料列大小限制而定 * CHAR、VARCHAR 和 TEXT的差異: VARCHAR/CHAR 可以給預設值;TEXT沒辦法給預設值 VARCHAR/CHAR 建索引可不指定索引長度,但TEXT一定要指定長度 CHAR 是固定長度,長度不足會補空白在右邊,VARCHAR、TEXT不會。 * BOLB 型態和TEXT都相同,只是BLOB專門拿來存二進位的資料,例如圖檔。 ref: https://www.w3resource.com/mysql/mysql-data-types.php http://n.sfs.tw/content/index/10266