MySQL與SQLServer的數據類型大同小異。因此,可以忽略與SQLServer相同的地方,在SQLServer的基礎上學習。
一、整型的顯示寬度
MySQL數據類型與SQLServer有些不同,其定義的基本形式如下:
整型類型(顯示寬度)
注意,正確的理解,其實是顯示寬度,因為整型的顯示寬度,對數值大小無影響,只是當設置了zerofill的時候,在顯示的時候補0而已。
從上面的顯示我們看到,設置了寬度為8,並且zerofill了,這樣在查詢的時候,會在前面自動補0。寬度可以不設置,因為整數數據類型都有默認的顯示寬度,不設就采用默認的。
另外,即使設置了顯示寬度,也能賦超過顯示寬度的值,整型的顯示寬度僅僅用於顯示補0。
二、浮點型與定點型
MySQL中可以指定浮點數和定點數的精度
數據類型(M,D)
- M:精度,數據的總長度;
- D:標度,小數點后的長度;
這種類型MySQL里有3種如:Float(6,2)、Double(6,2)、Decimal(6,2);
其區別在於:
- 當不指定精度時,Float、Double默認會保存實際精度,而Decimal默認是整數;
- 當標度不夠時,都會四舍五入,但Decimal會警告信息。
三、日期與時間類型
MySQL日期時間所有種類如下:
類型 | 字節數 | 取值范圍 | 零值 |
YEAR | 1 | 1901~2155 | 0000 |
DATE | 4 | 1000-01-01~9999-12-31 | 0000:00:00 |
TIME | 3 | -838:59:59~838:59:59 | 00:00:00 |
DATETIME | 8 | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 0000-00-00 00:00:00 |
TIMESTAMP | 4 | 1970-01-01 08:00:01~2038-01-19 11:14:07 | 00000000000000 |
DATE類型前面可以加個D,D表示天即24小時,如往DATE類型插入 '2 15:20:20';
另外TimeStamp類型與DateTime在無輸入的情況下要注意下:
- TimeStamp使用Current_TimeStamp()而DateTime使用NOW(來獲取當前時間);
- 輸入NULL時,系統會輸入系統當前日期與時間;
- 無任何輸入時,系統會輸入系統當前日期與時間;
四、字符串類型
在MySQL中,字符串類型包括CHAR、VARCHAR、BLOB、TEXT、ENUM、SET。
1、CHAR與VARCHAR
其定義方式為:
字符串類型(M)
這個M是長度的意思,插入該列的字符串長度將不允許超過M所指定的長度。另外,由於MySQL在建庫時就指定了字符集,因此就不存在nchar、nvarchar、ntext這種數據類型了。
- char最長可取255;
- varchar最長可取65535;
2、TEXT
TEXT分為4種,與SQLServer不同:
類型 | 允許的長度 | 存儲空間 |
TINYTEXT | 0~255字節 | 值的長度+2字節 |
TEXT | 0~65535字節 | 值的長度+2字節 |
MEDIUMTEXT | 0~167772150字節 | 值的長度+3字節 |
LONGTEXT | 0~4294967295字節 | 值的長度+4字節 |
3、ENUM類型
ENUM類型(枚舉類型),與C#的概念一樣,在定義時指定取值范圍。
屬性名 ENUM('值1','值2','值3'...'值n')
- ENUM有NOT NULL屬性,其默認值為取值列表的第一個元素;
- ENUM無NOT NULL,則ENUM類型將允許插入NULL,並且NULL為默認值;
CREATE TABLE Test4(Sex ENUM('男','女')); INSERT INTO Test4 VALUES('男'); INSERT INTO Test4 VALUES('爺'); --這行報錯 SELECT * FROM Test4;
4、SET類型
在創建表時,就指定SET類型的取值范圍。
屬性名 SET('值1','值2','值3'...,'值n')
它與ENUM的區別在什么地方呢?
基本上就是多選的ENUM。
5、二進制類型
二進制類型是在數據庫中存儲二進制數據的數據類型。二進制類型包括BINARY、VARBINARY、BIT、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB。
類型 | 取值范圍 |
BINARY(M) | 字節數為M,允許長度為0~M的定長二進制字符串 |
VARBINARY(M) | 允許長度為0~M的變長二進制字符串,字節數為值的長度加1 |
BIT(M) | M位二進制數據,M最大值為64 |
TINYBLOB | 可變長二進制數據,最多255個字節 |
BLOB | 可變長二進制數據,最多2的16次方-1個字節 |
MEDIUMBLOB | 可變長二進制數據,最多2的24次方-1個字節 |
LONGBLOB | 可變長二進制數據,最多2的32次方-1個字節 |
1、BINARY和VARBINARY
兩者唯一的差別在於BINARY當長度不夠時會補\0。
2、BIT類型
BIT類型與SQLServer里的就差別大了。 其定義方式為:
BIT(M)
其中"M"指定了該二進制的最大字節長度為M,M的最大值為64。如BIT(4)就是數據類型為BIT類型,長度為4。其能夠存儲的值為0-15。因為變成二進制后,15的值為1111。
在查詢BIT類型的數據時,要用BIN(字段名+0)來將值轉換為二進制顯示。
CREATE TABLE Test6(BB BIT(4)); INSERT INTO Test6 VALUES(12); SELECT BIN(BB+0) FROM Test6;
上面的結果以二進制顯示,最大的長度為4。
3、BLOB類型
BLOB類型是一種特殊的二進制類型。BLOB可以存儲數據量很大的二進制數據,如圖片,視頻等。BLOB類型包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們之間的區別也只是最大長度不同。
五、數據類型的選擇
- 整型:根據要顯示的最大值決定;
- 浮點型:要顯示小數。如果要精確到小數點后10位,就選擇DOUBLE,而不應該選擇FLOAT。DECIMAL精度較高,浮點數會出現誤差,如果精度較高,則應選擇定點數DECIMAL;
- 字符串型:定長與變長的區別,CHAR類型占用空間比較大,但是處理速度比VARCHAR快,如果長度變化不大,如身份證號碼那種,最好選擇CHAR類型。而對於評論字符串,最好選擇VARCHAR;
- 時間:根據需要顯示的類型咯,特別是TIMESTAMP,如果需要顯示的時間與時區對應,就應該選擇TIMESTAMP;
- ENUM類型和SET類型:長度不同,ENUM類型最多可以由65535個成員,而SET類型最多只能包含64個成員。且ENUM只能單選,而SET類型可以多選;
- TEXT類型和BLOB類型:TEXT只能存儲字符數據,而BLOB可以存儲二進制數據。如果是純文本,適合TEXT。如果是圖片等適合存二進制;
六、問題總結
1、存儲路徑的問題
MySQL中,如果路徑中使用"\"符號時,這個符號會被過濾。解決的辦法是路徑中用"/"或"\\"來代替"\"。這樣MySQL就不會自動過濾路徑中的分隔符。
2、MySQL中的布爾類型
MySQL中沒有Bool或Boolean類型,但是為了支持SQL標准,也可以定義Bool或Boolean類型的,但是Bool或Boolean類型最后轉換成的是TinyInt(1),也就是說,在MySQL中,布爾類型實際上是TinyInt(1)。
3、MySQL中如何存儲JPG圖片或MP3音樂
一般情況下,數據庫中不直接存儲圖片和音頻文件,而是存儲圖片或音頻文件的路徑,如果在特殊情況下需要在MySQL數據庫中存儲圖片和音頻文件,可以選擇BLOB類型;