創作內容

0 GP

MySQL學習-08-資料型態

作者:棉花棒│2020-06-02 01:34:43│贊助:0│人氣:19
欄位資料型態
建立表格時需幫欄位設定資料型態,主要分為以下三項。
數值:任何包含正負號整數與小數資料。位元資料也將以二進位表示儲存。
字串:分別為使用字元集與collation的non-binary字元與位元組組合而成的binary字串。
日期:包含日期,時間,日期時間。

整數
公式:型態名[長度]
型態 Byte 最大長度 有效範圍 無號數範圍
BigInt 8 20 -9223372036854775808~9223372036854775807 0~18446744073709551615
Int 4 11 -2147683648~2147683647 0~4294967295
Mediumint 3 9 -8388608~8388607 0~16777215
SmallInt 2 6 -32768~32767 0~65535
TinyInt 1 4 -128~127 0~255
整數就是不可儲存小數的數值型態,建立表格時以欄位可能的值大小來決定使用多大的整數型態,以達到節省空間增強效率的效果。另外最大長度是包含正負號的。
新增資料時注意以下幾點:
在新增時可以輸入小數做為新增資料,但是結果會四捨五入到整數位儲存。
範例:在Int(11)欄位新增資料123.6,會儲存124。
新增整數型態欄位時可以自訂義長度,但只要資料不超過該型態最大長度都可以正常儲存。
範例:在Int(3)欄位新增資料1234,可以正常儲存1234。
新增資料時須注意型態長度,新增超過最大長度的數值會導致新增失敗。
範例:在Int(3)欄位新增資料12345678901,因超過最大長度11位數(包含正負號11位數)所以新增失敗。

小數:
公式:型態名[長度,小數位數]
型態 Byte 長度 最大長度,位數 說明
Float 4 根據os不同而不同 255,30 單精確浮點數(近似值)
Double 8 根據os不同而不同 255,30 雙精確浮點數(近似值)
Decimal 自訂 10 65,30 自訂義精確值
Float 與 Double都是近似值,若是須要非常精確的運算可以用Decimal 來得到精確值。
Decimal 也能用 Numeric 關鍵字來進行,兩者結果一模一樣。
新增小數時要注意一些規定,跟整數一樣不可以超過最大長度,小數位數也不可以超過30,當長度與小數位數一樣時整數部分將不會被儲存。
與整數不同的是,當新增資料長度大於設定的長度時小數的部分將自動四捨五入到設定好的小數位數。
範例:double(5,2)的欄位新增123.456時,小數會自動四捨五入到第二位,儲存資料為123.46
若是小數點前的部分超過長度則會導致新增失敗。
範例:double(5,2)的欄位新增12345.67時,此欄位資料會因長度錯誤新增失敗。

另外數值型態還有兩個關鍵字分別為Unsigned 以及 Zerofill。
Unsigned會讓此欄位只能新增正數。
範例:在Int(3)Unsigned 欄位新增資料 -123 會導致錯誤而新增失敗。
Zerofill會讓欄位根據設定長度補0。
範例:在Int(3)Zerofill 欄位新增資料1 會在查看資料時得到 001。

位元型態:
公式:BIT[長度]
型態 數字範圍
BIT 0~1
BIT(8) 0~255
BIT(64) 0~18446744073709551615
位元資料也是儲存數值用的,不過是以二進位儲存,因此實際上是以0跟1表示。
另外新增資料時支援兩種方式。
範例:儲存新數字128。
可在新增時直接給定10進位數字,insert into 表格 values(128)。
或是新增時在b後面用單引號框住並以二進位表示,insert into 表格 values(b'10000000')。

字串型態:
型態 最大長度 實際儲存空間
Char 255 與指定的長度相同byte
Varchar 65535 字元個數+1~2byte
TinyText 255 字元個數+1byte
Text 65535 字元個數+2byte
MediunText 16772215 字元個數+3byte
LongText 4294967295 字元個數+4byte
Char預設長度只有1,且指定長度後會固定長度,Varchar則為可變動長度字串。
範例:分別以char(10),Varchar(10)儲存"","123","1234567890"
字串 char(10) varchar(10)
"" "1234567890" ''"
"123" "1234567890" "123"
"1234567890" "1234567890" "1234567890"
這樣差別一目了然,使用varchar可以根據字串長度動態變更儲存大小,而char不行。

字元集:
從字元集搜尋一下big5資訊可以得到
Maxlen代表儲存的最大byte數。
這裡新增一個設定為big5字元集的表格
使用Length關鍵字可以查看每一列所使用的儲存空間。
執行結果
由此可見英文字母1個1byte,中文字1個2byte。
若是想看字串長度則需使用char_length。
執行結果

這裡新增一個表格
分別將s 設定成 latin1_general_cs , s2 設定成 latin1_general_ci
ci代表不區分大小寫,cs則會區分大小寫。

二進制字串
字串型態:
型態 最大長度 實際儲存空間
Binary 255 與指定的長度相同byte
VarBinary 65535 長度+1~2byte
TinyBlob 255 byte個數+1byte
Blob 65535 byte個數+2byte
MediunBlob 16772215 byte個數+3byte
LongBlob 4294967295 byte個數+4byte
與char一樣Binary指定大小後會用0補滿剩下位置,而其他方法可以動態改變儲存大小。
二進位制字串無法制定字元集,但是可以用來儲存所有文字,圖片或音樂。

列舉與集合
型態 最大個數 儲存空間
ENUM 65535 1byte(255個)
2byte(255~65535個)
SET 64 1byte(8個)
2byte(16個)
3byte(24個)
4byte(32個)
8byte(64個)
固定的幾個資料表示法很適合用ENUM列舉來儲存,比如主機板常以ITX,ATX,EATX來區分大小。
這裡用列舉與一般字串來舉例:
兩者的區別在列舉一開始就要設定好那些資料可以被輸入。
可以看到除了ITX,ATX,EATX以外都不是列舉內容。
這在某種意義上成了防止錯誤資料進入的機制。
若是用string新增資料AAAA可以成功被儲存,但是AAAA並不是任何一種主機板尺寸。
若是用ENUM新增資料AAAA就會因為不是列舉的內容而被阻止寫入。
另外ENUM會自動幫成員內容由左而右上編號,以上圖為例ITX=1,ATX=2,EATX=3。
若是在新增資料時指定列舉欄位並新增1,實際上會儲存ITX。

集合:
與ENUM一樣可以過濾不正確的內容,且可以一次在一列新增多個SET資料。
執行結果
與列舉相同,SET也會自動上編號,不過稍微複雜點。
由左而右分別為2的0次方,2的1次...到N次。
由此題為例三者編號分別是
ITX ATX EATX
2^0=1 2^1=2 2^2=4
也就是說在Value內('1,1,2')可以得到ITX,ITX,ATX。

日期與時間
型態 Bytes 中文 範圍
Date 3 日期 '1000-01-01'~'9999-12-31'
Time 3 時間 '-838:59:59'~'838:59:59'
Datetime 8 日期與時間 '1000-01-01 00:00:00'~
'9999-12-31 23:59:59'
Year 1 西元年 1901~2155
Timestamp 4 日期與時間 '1970-01-01 00:00:00'~
'2037-12-31 23:59:59'
Date:
insert 表格 (d) values('1900-1-1')   -> 1900-01-01
西元年70~99=1970~1999,00~69=2000~2069
insert 表格 (d) values('90-1-1')   -> 1990-01-01

Time:
insert 表格 (t) values('100:15:20')   -> 100:15:20
insert 表格 (t) values('100:20')   -> 100:20:00
insert 表格 (t) values('100')   -> 100:00:00

DateTime:
insert 表格 (dt) values('1900-1-1 15:58:26')   -> 1900-01-01 15:58:26
insert 表格 (dt) values('1900-1-1')   -> 1900-01-01 00:00:00

Year:
insert 表格 (y4) values('1900')   -> 1900
insert 表格 (y4) values('19')   -> 2019
insert 表格 (y4) values('1')   -> 2001
insert 表格 (y4) values('0')   -> 2000
insert 表格 (y4) values('00')   -> 2000
insert 表格 (y4) values('0000')   -> 0000

TimeStamp:
它會儲存1970-01-01 00:00:00到現在過了多少秒
insert 表格 (ts) values('1970-1-1 08:00:01')  會先-8小時因為目前時區在+8時區
= 1970-01-01 00:00:01 -> 1







引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4802832
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

喜歡★QWERTYUIOP32 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:MySQL學習-07-字... 後一篇:MySQL學習-09-表...

追蹤私訊

作品資料夾

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】