字段型別與合理的選擇字段型別

2021-08-08 12:07:01 字數 3207 閱讀 2469

本篇部落格稍微有點長,它實際上包括兩個內容:一是mysql欄位型別的介紹,二是在mysql建表過程中是如何正確選擇這些字段型別;

mysql 的數值資料型別可以大致劃分為兩個類別,乙個是整數,另乙個是浮點數或小數。

許多不同的子型別對這些類別中的每乙個都是可用的,每個子型別支援不同大小的資料,並且 mysql 允許我們指定數值字段中的值是否有正負之分(unsigned)或者用零填補(zerofill)。

mysql 以乙個可選的顯示寬度指示器的形式對 sql 標準進行擴充套件(如 int(6),6即是其寬度指示器,該寬度指示器並不會影響int列儲存欄位的大小,也就是說,超過6位它不會自動擷取,依然會儲存,只有超過它本身的儲存範圍才會擷取;此處寬度指示器的作用在於該欄位是否有zerofill,如果有就未滿足6位的部分就會用0來填充),這樣當從資料庫檢索乙個值時,可以把這個值加長到指定的長度。例如,指定乙個欄位的型別為 int(6),就可以保證所包含數字少於 6 個的值從資料庫中檢索出來時能夠自動地用空格填充。需要注意的是,使用乙個寬度指示器不會影響欄位的大小和它可以儲存的值的範圍。

萬一我們需要對乙個字段儲存乙個超出許可範圍的數字,mysql 會根據允許範圍最接近它的一端截短後再進行儲存。還有乙個比較特別的地方是,mysql 會在不合規定的值插入表前自動修改為 0。

為什麼mysql儲存的值要分有符號和無符號呢?因為乙個位元組,佔8bit;也就1個bit有0和1兩種可能,8個bit就是2^8 = 256種可能,也就是0~255;但如果是有符號的話,就得拿乙個1bit來儲存這個負號,本來8bit只剩7bit,2^7 = 128,也就是-128~127(正數部分包含乙個0);

關於flaot和double

在這裡我建議,乾脆忘記mysql有double這個資料型別。至於why?就不要管它了

mysql 提供了 8 個基本的字串型別,可以儲存的範圍從簡單的乙個字元到巨大的文字塊或二進位制字串資料。

char 型別可以使用 binary 修飾符。當用於比較運算時,這個修飾符使 char 以二進位制方式參於運算,而不是以傳統的區分大小寫的方式。

char 型別的乙個變體是 varchar 型別。它是一種可變長度的字串型別,並且也必須帶有乙個範圍在 0-255 之間的指示器。

char 和 varchgar 不同之處在於 mysql 資料庫處理這個指示器的方式:char 把這個大小視為值的大小,不長度不足的情況下就用空格補足。而 varchar 型別把它視為最大值並且只使用儲存字串實際需要的長度(增加乙個額外位元組來儲存字串本身的長度)來儲存值。所以短於指示器長度的 varchar 型別不會被空格填補,但長於指示器的值仍然會被截短。

因為 varchar 型別可以根據實際內容動態改變儲存值的長度,所以在不能確定字段需要多少字元時使用 varchar 型別可以大大地節約磁碟空間、提高儲存效率。但如果確切知道字串長度,比如就在50~55之間,那就用 char 因為 char 型別由於本身定長的特性使其效能要高於 varchar;

varchar 型別在使用 binary 修飾符時與 char 型別完全相同。

text 和 blob 型別在分類和比較上存在區別。blob 型別區分大小寫,而 text 不區分大小寫。大小修飾符不用於各種 blob 和 text 子型別。比指定型別支援的最大範圍大的值將被自動截短。

在處理日期和時間型別的值時,mysql 帶有 5 個不同的資料型別可供選擇。

需要注意的是,沒有冒號分隔符的 time 型別值,將會被 mysql 理解為持續的時間,而不是時間戳。

mysql 還對日期的年份中的兩個數字的值,或是 sql 語句中為 year 型別輸入的兩個數字進行最大限度的通譯。因為所有 year 型別的值必須用 4 個數字儲存。mysql 試圖將 2 個數字的年份轉換為 4 個數字的值。把在 00-69 範圍內的值轉換到 2000-2069 範圍內。把 70-99 範圍內的值轉換到 1970-1979 之內。如果 mysql 自動轉換後的值並不符合我們的需要,請輸入 4 個數字表示的年份。

如果我們對 timestamp 型別的字段沒有明確賦值,或是被賦與了 null 值。mysql 會自動使用系統當前的日期和時間來填充它。

mysql 還支援兩種復合資料型別 enum 和 set,它們擴充套件了 sql 規範。雖然這些型別在技術上是字串型別,但是可以被視為不同的資料型別。乙個 enum 型別只允許從乙個集合中取得乙個值;而 set 型別允許從乙個集合中取得任意多個值。

enum 型別在系統內部可以儲存為數字,並且從 1 開始用數字做索引。乙個 enum 型別最多可以包含 65536 個元素,其中乙個元素被 mysql 保留,用來儲存錯誤資訊,這個錯誤值用索引 0 或者乙個空字串表示。

mysql 認為 enum 型別集合中出現的值是合法輸入,除此之外其它任何輸入都將失敗。這說明通過搜尋包含空字串或對應數字索引為 0 的行就可以很容易地找到錯誤記錄的位置。

雖然上面列出了很多字段型別,但最常用也就是 varchar(255),char(255),text,tinyint(4),smallint(6),mediumint,int(11)幾種。

復合型別我們一般用tinyint,更快的時間更省的空間以及更容易擴充套件

關於手機號,推薦用char(11),char(11)在查詢上更有效率,因為手機號是乙個活躍字段參與邏輯會很多。

一些常用字段舉例

姓名:char(20)

**:decimal(7, 3)

產品序列號:smallint(5) unsigned

文章內容: text

md5: char(32)

ip: char(15)

time: int(10)

email char(32)

但是,工作中隨著專案越做越多,業務邏輯的處理越來越難以後,我發現時間型別還是用時間型別本身的字段型別要好一些,因為mysql有著豐富的時間函式供我使用,方便我完成很多與時間相關的邏輯,比如月排行榜,周排行榜,當日熱門,生日多少天等等邏輯

from:

字段型別與合理的選擇字段型別

mysql 的數值資料型別可以大致劃分為兩個類別,乙個是整數,另乙個是浮點數或小數。許多不同的子型別對這些類別中的每乙個都是可用的,每個子型別支援不同大小的資料,並且 mysql 允許我們指定數值字段中的值是否有正負之分 unsigned 或者用零填補 zerofill mysql 以乙個可選的顯示...

mysql 字段型別選擇

整數型別 型別占用位元組 數值範圍 tinyint 1 128 127 0 255 smallint 2 32768 32767 0 65535 mediumint 3 8388608 8388607 0 16777215 int integer 4 2147483648 2147483647 0 ...

MySQL 字段型別選擇

在對資料進行比較操作時,同樣的資料,字元處理往往比數字處理慢,int要比varchar型別在mysql處理上簡單。比如時間可以考慮用int來儲存,ip位址也可以考慮用bigint來儲存。列的長度越小,利於效能提公升。tinyint適合列舉,0標示男,1標示女,2,標示保密 char與varchar ...