欄位型別
數值
MySQL 的數值資料型別可以大致劃分為兩個類別,一個是整數,另一個是浮點數或小數。
許多不同的子型別對這些類別中的每一個都是可用的,每個子型別支援不同大小的資料,並且 MySQL 允許我們指定數值欄位中的值是否有正負之分(UNSIGNED
)或者用零填補(ZEROFILL
)。
MySQL 以一個可選的顯示寬度指示器
的形式對 SQL 標準進行擴充套件(如 INT(6),6即是其寬度指示器,該寬度指示器並不會影響int列儲存欄位的大小,也就是說,超過6位它不會自動擷取,依然會儲存,只有超過它本身的儲存範圍才會擷取;此處寬度指示器的作用在於該欄位是否有zerofill,如果有就未滿足6位的部分就會用0來填充),這樣當從資料庫檢索一個值時,可以把這個值加長到指定的長度。例如,指定一個欄位的型別為 INT(6),就可以保證所包含數字少於 6 個的值從資料庫中檢索出來時能夠自動地用空格填充。需要注意的是,使用一個寬度指示器不會影響欄位的大小和它可以儲存的值的範圍。
萬一我們需要對一個欄位儲存一個超出許可範圍的數字,MySQL 會根據允許範圍最接近它的一端截短後再進行儲存。還有一個比較特別的地方是,MySQL 會在不合規定的值插入表前自動修改為 0。
字串型別
MySQL 提供了 8 個基本的字串型別,可以儲存的範圍從簡單的一個字元到巨大的文字塊或二進位制字串資料。
一個英文字元 佔用一個位元組;
漢字:
字元型別若為gbk,每個字元最多佔2個位元組;
字元型別若為utf8,每個字元最多佔3個位元組。
- CHAR 和 VARCHAR 型別
CHAR 型別用於定長字串
,並且必須在圓括號內用一個大小修飾符來定義。這個大小修飾符的範圍從 0-255。比指定長度大的值將被截短,而比指定長度小的值將會用空格作填補。
CHAR 型別的一個變體是 VARCHAR 型別。它是一種可變長度
的字串型別,並且也必須帶有一個範圍指示器。
CHAR 和 VARCHGAR 不同之處在於 MYSQL 資料庫處理這個指示器的方式:CHAR 把這個大小視為值的大小,不長度不足的情況下就用空格補足。而 VARCHAR 型別把它視為最大值並且只使用儲存字串實際需要的長度(增加一個額外位元組來儲存字串本身的長度)來儲存值。所以短於指示器長度的 VARCHAR 型別不會被空格填補,但長於指示器的值仍然會被截短。
因為 VARCHAR 型別可以根據實際內容動態改變儲存值的長度,所以在不能確定欄位需要多少字元時使用 VARCHAR型別可以大大地節約磁碟空間、提高儲存效率。但如果確切知道字串長度,比如就在50~55之間,那就用 CHAR 因為 CHAR
型別由於本身定長的特性使其效能要高於 VARCHAR;
時間型別
int(11)最大長度是多少?
在SQL語句中int代表你要建立欄位的型別,int代表整型,11代表欄位的長度。
這個11代表顯示寬度
,整數列的顯示寬度與mysql需要用多少個字元來顯示該列數值,與該整數需要的儲存空間的大小都沒有關係
,比如,不管設定了顯示寬度是多少個字元,bigint都要佔用8個位元組。
int是整型,(11)是指顯示字元的長度,但要加引數的,最大為255,比如它是記錄行數的id,插入10筆資料,它就顯示00000000001 ~~~00000000010,當字元的位數超過11,它也只顯示11位,如果你沒有加那個讓它未滿11位就前面加0的引數,它不會在前面加0
宣告整型資料列時,我們可以為它指定個顯示寬度M(1~255),如INT(5),指定顯示寬度為5個字元,如果沒有給它指定顯示寬度,MySQL會為它指定一個預設值。顯示寬度只用於顯示,並不能限制取值範圍和佔用空間,如:INT(3)會佔用4個位元組的儲存空間,並且允許的最大值也不會是999,而是 INT整型所允許的最大值。
在整型資料列後加上UNSIGNED屬性可以禁止負數,取值從0開始。
varchar最大長度是多少?
一. varchar儲存規則:
4.0版本以下,varchar(20),指的是20位元組,如果存放UTF8漢字時,只能存6個(每個漢字3位元組)
5.0版本以上,varchar(20),指的是20字元,無論存放的是數字、字母還是UTF8漢字(每個漢字3位元組),都可以存放20個,最大大小是65532位元組
Mysql4中最大也不過是20個位元組,但是Mysql5根據編碼不同,儲存大小也不同。
在varchar(M)型別的資料列裡,每個值只佔用剛好夠用的位元組再加上一個用來記錄其長度的位元組(即總長度為L+1位元組).
varchar最大長度是多少?
這不是一個固定的數字。先簡要說明一下限制規則。
1、限制規則
欄位的限制在欄位定義的時候有以下規則:
a) 儲存限制
varchar 欄位是將實際內容單獨儲存在聚簇索引之外,內容開頭用1到2個位元組表示實際長度(長度超過255時需要2個位元組),因此最大長度不能超過65535。
b) 編碼長度限制
字元型別若為gbk,每個字元最多佔2個位元組,最大長度不能超過32766;
字元型別若為utf8,每個字元最多佔3個位元組,最大長度不能超過21845。
若定義的時候超過上述限制,則varchar欄位會被強行轉為text型別,併產生warning。
c) 行長度限制
導致實際應用中varchar長度限制的是一個行定義的長度。 MySQL要求一個行的定義長度不能超過65535。若定義的表長度超過這個值,則提示
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。
2、計算例子
舉兩個例說明一下實際長度的計算。
a) 若一個表只有一個varchar型別,如定義為
create table t4(c varchar(N)) charset=gbk;
則此處N的最大值為(65535-1-2)/2= 32766。
減1的原因是實際行儲存從第二個位元組開始’;
減2的原因是varchar頭部的2個位元組表示長度;
除2的原因是字元編碼是gbk。
欄位型別總結
1.關於手機號,推薦用char(11),char(11)在查詢上更有效率,因為手機號是一個活躍欄位參與邏輯會很多。
合理的選擇資料型別
- 選擇合理範圍內最小的
我們應該選擇最小的資料範圍,因為這樣可以大大減少磁碟空間及磁碟I/0讀寫開銷,減少記憶體佔用,減少CPU的佔用率。
- 選擇相對簡單的資料型別
數字型別相對字串型別要簡單的多,尤其是在比較運算時,所以我們應該選擇最簡單的資料型別。
列屬性儘量為NOT NULL
為什麼這麼說呢,因為MYSQL對NULL欄位索引優化不佳,增加更多的計算難度,同時在儲存與處理NULL類形時,也會做更多的工作,所以從效率上來說,不建議用過多的NULL。有些值他確實有可能沒有值,怎麼辦呢?解決方法是數值弄用整數0,字串用空來定義預設值即可。