[精讚] [會員登入]
5908

[Mysql] 資料型態int, float, double, text, char, varchar, blob大小

Mysql中資料型態int, float, text, char, varchar, blob大小

此文完整連結 http://n.sfs.tw/10266

複製連結 [Mysql] 資料型態int, float, double, text, char, varchar, blob大小@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2016-11-26 14:08:44 最後編修
2016-11-21 16:13:54 By 瘦河馬
 

INT 整數型態

  儲存位元 最小值 最大值
TINYINT 1 -128 127
SMALLINT 2 -32768 32767
MEDIUMINT 3 -8,388,608 8,388,607 (838萬)
INT 4 -2147483648 2,147,483,647 (21億)
BIGINT 8 -9,223,372,036,854,775,808 9,223,372,036,854,775,807 (922京)

* 如果輸入值超過範圍會出現 #1264 - Out of range value for column 錯誤

* 如果 update 超過範圍也會出現 #1264 - Out of range value for column 錯誤,不會再出現翻轉的問題

* 修改為無正負號的類型(UNSIGNED TYPE)

   ALTER TABLE `table` CHANGE `col` `col` TINYINT(1) unsigned NOT NULL

FLOAT 浮點型態

  儲存位元 最小值 最大值 有效位數
FLOAT 4 -3.402823466E+38 3.402823466E+38 ~ 7
DOUBLE 8 -1.7976931348623157E+308 1.7976931348623157E+308 ~ 17
DECIMAL* 每9個數字4個位元  ~ -1E+66  ~ 1E+66 1~65

* 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 是精準數值,占用空間比較大,適合算和錢有關的,或是需要存較精準的數字。

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專門拿來存二進位的資料,例如圖檔。

參考資料

[1] http://stackoverflow.com/questions/4834390/how-to-use-mysql-decimal
[2] http://dev.mysql.com/doc/refman/5.7/en/precision-math-decimal-characteristics.html
[3] http://wubx.net/varchar-vs-text/
[4] http://dev.mysql.com/doc/refman/5.7/en/blob.html

 

你可能感興趣的文章

[Mysql] 建立叢集式資料庫2/4 -- DB2、DB3設定 使用galera建立Mysql的叢集式資料庫 ,繼續建立第2,第3台DBs

[Mysql] 修改欄位的自動索引值autoindex (auto_increment ) Mysql 新增、刪除、修改、查看欄位的自動索引值autoindex (auto_increment)

[Mysql] Mysqldump 的預設編碼 --default-character-set 有時Mysqldump 也得要指定編碼才不會造成匯出的亂碼

[Mysql/Mariadb] 建立使用者及資料庫 Mysql/Mariadb建立使用者、刪除使用者、給予權限、建立資料庫

[Mysql/MariaDB] 查看資料庫所占空間 查看資料庫在磁碟中所占空間

[Mysql] 建立叢集式資料庫1/4 -- 安裝及設定DB1 使用galera建立Mysql的叢集式資料庫 (GALERA CLUSTER FOR MYSQL THE TRUE MULTI-MASTER)

[Mysql/Mariadb] 全文檢索 fulltext index 關於 MySQL 的全文檢索

[MySQL] FIND_IN_SET函數,把多筆條件判斷弄成字串 SQL 我們如果要查找某個欄位是否為某個值的時候,如果要判斷的條件很多,可以用這個函數

[MariaDB] Centos 7安裝mariadb + apache + php + phpmyadmin Centos 7安裝mariadb+apache+php+phpmyadmin

Mysql 安裝完畢要做的事 Mysql 安裝完畢後,該處理的流程

我有話要說


限制:留言最高字數1000字,超過部分會被截掉。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

[Freebsd] 定時測試 ADSL 是否斷線並重連 中華電信 ADSL 雖有固定 ip,可是他卻會不定時「斷線」, 使用以下的 方法可以定時測試是否斷線,以及重新撥接。

Linux shell 的date表示法 linux下SHELL中的date表示法

[bc] linux 的計算機 bc 設定小數位數、計算π、次方根 linux 的計算機 bc 設定小數位數、計算π、次方根

TFTP Server 安裝及使用 讓設備的網路設定檔或是韌體經由TFTP拷備出來,操作的方法

[AS3] 我做的唯一一個Flash As3遊戲UFO INVADSION [AS3] 我做的唯一一個Flash As3遊戲,是第一個也是最後一個,後來就沒再寫as3,不過as3還滿好玩的。