[精讚] [會員登入]
41868

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

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

分享此文連結 //n.sfs.tw/10266

分享連結 [Mysql] 資料型態int, float, double, text, char, varchar, blob大小@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-11-07 01:48:05 最後編修
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

 

END

你可能感興趣的文章

[MySQL/Mariadb] 正規表達式(regular express) mysql的正規表達式很詭異,很不能接受

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

[Mysql/MariaDB] 加解密函數 Mysql/MariaDB上的加解密函數

[MySQL/Mariadb] console 將查詢結果輸出到檔案 在mysql 的console中該如何將查詢結果輸出到檔案?

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

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

我有話要說

>>

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

訪客留言

訪客
\"[Mysql] 資料型態int, float, double, text, char, varchar, blob大小\"這篇文裡說到\"float 最大的問題是有效位數只有7個,其他會亂塞值(磁碟中未清除的位元?),所以只能用在精準度要求不高的地方,避免使用。\"不是浮點數有效位數只有7位,有效精度是會隨著數值而漂浮的,有興趣請去看看IEEE754的規範,也不是亂塞數值,那是截位誤差。 留言不能放網址請先註明,讓我又重打一次。 @2018-06-07 20:08:04

新精讚
原來是因為「截位誤差」,我還是第一次聽到這個名詞,感謝您的留言。留言不能有網址讓您重打真是抱歉,我會再來修改設定。
2018-06-07 20:33:43

隨機好文

[MAC] 截取螢幕畫面的方法 截取螢幕畫面的方法,在MAC中叫作螢幕快照,英文是screenshot

如何在linux下執行java 原生的java應用程式可以使用簡單的方法在console下面寫出來,適合作簡單的應用

[Windows7] 移除IE10及移除IE11 Windows7 不得已的情況要移除IE11或IE10怎麼做?

APACHE的記錄檔格式 LogFormat 語法 在APACHE中有定義一些記錄的語法模版 在 /etc/httpd/conf/httpd.conf 中: LogForm

[PHP] 檢查IP是否在某個網段內 mtachcidr 要檢查IP是否在某個網段內,要寫幾行?10行?5行? 不用,只要2行。以下是我寫的 code /** * matchCI