表的数据类型
介紹
存儲引擎決定了表的類型,而表內存放的數據也要有不同的類型,每種數據類型都有自己的寬度,但寬度是可選的
詳細參考:
? http://www.runoob.com/mysql/mysql-data-types.html
? http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html
mysql常用數據類型概覽
數值類型
1、整數類型
整數類型:tinyint smallint mediumint int bigint
作用:存儲年齡,等級,id,各種號碼等
驗證:
=========有符號和無符號tinyint========== #tinyint默認為有符號 MariaDB [db1]> create table t1(x tinyint); #默認為有符號,即數字前有正負號 MariaDB [db1]> desc t1; MariaDB [db1]> insert into t1 values-> (-129),-> (-128),-> (127),-> (128); MariaDB [db1]> select * from t1; +------+ | x | +------+ | -128 | #-129存成了-128 | -128 | #有符號,最小值為-128 | 127 | #有符號,最大值127 | 127 | #128存成了127 +------+#設置無符號tinyint MariaDB [db1]> create table t2(x tinyint unsigned); MariaDB [db1]> insert into t2 values-> (-1),-> (0),-> (255),-> (256); MariaDB [db1]> select * from t2; +------+ | x | +------+ | 0 | -1存成了0 | 0 | #無符號,最小值為0 | 255 | #無符號,最大值為255 | 255 | #256存成了255 +------+============有符號和無符號int============= #int默認為有符號 MariaDB [db1]> create table t3(x int); #默認為有符號整數 MariaDB [db1]> insert into t3 values-> (-2147483649),-> (-2147483648),-> (2147483647),-> (2147483648); MariaDB [db1]> select * from t3; +----------------+ | x | +----------------+ | -2147483648 | #-2147483649存成了-2147483648 | -2147483648 | #有符號,最小值為-2147483648 | 2147483647 | #有符號,最大值為2147483647 | 2147483647 | #2147483648存成了2147483647 +----------------+#設置無符號int MariaDB [db1]> create table t4(x int unsigned); MariaDB [db1]> insert into t4 values-> (-1),-> (0),-> (4294967295),-> (4294967296); MariaDB [db1]> select * from t4; +---------------+ | x | +---------------+ | 0 | #-1存成了0 | 0 | #無符號,最小值為0 | 4294967295 | #無符號,最大值為4294967295 | 4294967295 | #4294967296存成了4294967295 +---------------+==============有符號和無符號bigint============= MariaDB [db1]> create table t6(x bigint); MariaDB [db1]> insert into t5 values -> (-9223372036854775809),-> (-9223372036854775808),-> (9223372036854775807),-> (9223372036854775808);MariaDB [db1]> select * from t5; +------------------------------+ | x | +------------------------------+ | -9223372036854775808 | | -9223372036854775808 | | 9223372036854775807 | | 9223372036854775807 | +------------------------------+MariaDB [db1]> create table t6(x bigint unsigned); MariaDB [db1]> insert into t6 values -> (-1),-> (0),-> (18446744073709551615),-> (18446744073709551616);MariaDB [db1]> select * from t6; +------------------------------+ | x | +------------------------------+ | 0 | | 0 | | 18446744073709551615 | | 18446744073709551615 | +-------------------------------+======用zerofill測試整數類型的顯示寬度============= MariaDB [db1]> create table t7(x int(3) zerofill); MariaDB [db1]> insert into t7 values-> (1),-> (11),-> (111),-> (1111); MariaDB [db1]> select * from t7; +------+ | x | +------+ | 001 | | 011 | | 111 | | 1111 | #超過寬度限制仍然可以存 +------+ View Code注意:為該類型指定寬度時,僅僅只是指定查詢結果的顯示寬度,與存儲范圍無關,存儲范圍如下
其實我們完全沒必要為整數類型指定顯示寬度,使用默認的就可以了
默認的顯示寬度,都是在最大值的基礎上加1
int的存儲寬度是4個Bytes,即32個bit,即2**32
無符號最大值為:4294967296-1
有符號最大值:2147483648-1
有符號和無符號的最大數字需要的顯示寬度均為10,而針對有符號的最小值則需要11位才能顯示完全,所以int類型默認的顯示寬度為11是非常合理的
最后:整形類型,其實沒有必要指定顯示寬度,使用默認的就ok
2、浮點型
定點數類型 ?DEC等同于DECIMAL
浮點類型:FLOAT DOUBLE
作用:存儲薪資、身高、體重、體質參數等
float:
#FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 定義:單精度浮點數(非準確小數值),m是數字總個數,d是小數點后個數。m最大值為255,d最大值為30有符號:-3.402823466E+38 to -1.175494351E-38,1.175494351E-38 to 3.402823466E+38 無符號:1.175494351E-38 to 3.402823466E+38精確度: **** 隨著小數的增多,精度變得不準確 ****double:
#DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] 定義:雙精度浮點數(非準確小數值),m是數字總個數,d是小數點后個數。m最大值為255,d最大值為30有符號:-1.7976931348623157E+308 to -2.2250738585072014E-3082.2250738585072014E-308 to 1.7976931348623157E+308無符號:2.2250738585072014E-308 to 1.7976931348623157E+308精確度:****隨著小數的增多,精度比float要高,但也會變得不準確 ****decimal:
decimal[(m[,d])] [unsigned] [zerofill]定義:準確的小數值,m是數字總個數(負號不算),d是小數點后個數。 m最大值為65,d最大值為30。精確度:**** 隨著小數的增多,精度始終準確 ****對于精確數值計算時需要用此類型decaimal能夠存儲精確值的原因在于其內部按照字符串存儲。驗證:
mysql> create table t1(x float(256,31)); ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30. mysql> create table t1(x float(256,30)); ERROR 1439 (42000): Display width out of range for column 'x' (max = 255) mysql> create table t1(x float(255,30)); #建表成功 Query OK, 0 rows affected (0.02 sec)mysql> create table t2(x double(255,30)); #建表成功 Query OK, 0 rows affected (0.02 sec)mysql> create table t3(x decimal(66,31)); ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30. mysql> create table t3(x decimal(66,30)); ERROR 1426 (42000): Too-big precision 66 specified for 'x'. Maximum is 65. mysql> create table t3(x decimal(65,30)); #建表成功 Query OK, 0 rows affected (0.02 sec)mysql> show tables; +-------------------+ | Tables_in_db1 | +------------------+ | t1 | | t2 | | t3 | +------------------+ 3 rows in set (0.00 sec)mysql> insert into t1 values(1.1111111111111111111111111111111); #小數點后31個1 Query OK, 1 row affected (0.01 sec)mysql> insert into t2 values(1.1111111111111111111111111111111); Query OK, 1 row affected (0.00 sec)mysql> insert into t3 values(1.1111111111111111111111111111111); Query OK, 1 row affected, 1 warning (0.01 sec)mysql> select * from t1; #隨著小數的增多,精度開始不準確 +------------------------------------------------+ | x | +------------------------------------------------+ | 1.111111164093017600000000000000 | +------------------------------------------------+ 1 row in set (0.00 sec)mysql> select * from t2; #精度比float要準確點,但隨著小數的增多,同樣變得不準確 +------------------------------------------------+ | x | +------------------------------------------------+ | 1.111111111111111200000000000000 | +------------------------------------------------+ 1 row in set (0.00 sec)mysql> select * from t3; #精度始終準確,d為30,于是只留了30位小數 +-----------------------------------------------+ | x | +------------------------------------------------+ | 1.111111111111111111111111111111 | +------------------------------------------------+ 1 row in set (0.00 sec) View Code3、位類型
BIT(M)可以用來存放多位二進制數,M范圍從1~64,如果不寫默認為1位。
注意:對于位字段需要使用函數讀取
? ? bin()顯示為二進制
? ? hex()顯示為十六進制
驗證:
MariaDB [db1]> create table t9(id bit); MariaDB [db1]> desc t9; #bit默認寬度為1 +-------+--------+------+-----+---------+--------+ | Field | Type | Null | Key | Default | Extra | +-------+--------+------+-----+---------+--------+ | id | bit(1) | YES | | NULL | | +-------+--------+------+-----+---------+--------+MariaDB [db1]> insert into t9 values(8); MariaDB [db1]> select * from t9; #直接查看是無法顯示二進制位的 +------+ | id | +------+ | | +------+ MariaDB [db1]> select bin(id),hex(id) from t9; #需要轉換才能看到 +---------+---------+ | bin(id) | hex(id) | +---------+---------+ | 1 | 1 | +---------+---------+MariaDB [db1]> alter table t9 modify id bit(5); MariaDB [db1]> insert into t9 values(8); MariaDB [db1]> select bin(id),hex(id) from t9; +---------+---------+ | bin(id) | hex(id) | +---------+---------+ | 1 | 1 | | 1000 | 8 | +---------+---------+ View Code日期類型
DATE TIME DATETIME?TIMESTAMP YEAR?
作用:存儲用戶注冊時間,文章發布時間,員工入職時間,出生時間,過期時間等
datetime與timestamp的區別
在實際應用的很多場景中,MySQL的這兩種日期類型都能夠滿足我們的需要,存儲精度都為秒,但在某些情況下,會展現出他們各自的優劣。下面就來總結一下兩種日期類型的區別。
1.DATETIME的日期范圍是1001——9999年,TIMESTAMP的時間范圍是1970——2038年。
2.DATETIME存儲時間與時區無關,TIMESTAMP存儲時間與時區有關,顯示的值也依賴于時區。在mysql服務器,操作系統以及客戶端連接都有時區的設置。
3.DATETIME使用8字節的存儲空間,TIMESTAMP的存儲空間為4字節。因此,TIMESTAMP比DATETIME的空間利用率更高。
4.DATETIME的默認值為null;TIMESTAMP的字段默認不為空(not null),默認值為當前時間(CURRENT_TIMESTAMP),如果不做特殊處理,并且update語句中沒有指定該列的更新值,則默認更新為當前時間。
字符串類型
官網:https://dev.mysql.com/doc/refman/5.7/en/char.html
注意:char和varchar括號內的參數指的都是字符的長度
char類型:
#char類型:定長,簡單粗暴,浪費空間,存取速度快字符長度范圍:0-255(一個中文是一個字符,是utf8編碼的3個字節)存儲:存儲char類型的值時,會往右填充空格來滿足長度例如:指定長度為10,存>10個字符則報錯,存<10個字符則用空格填充直到湊夠10個字符存儲檢索:在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,除非我們打開pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)varchar類型:
#varchar類型:變長,精準,節省空間,存取速度慢字符長度范圍:0-65535(如果大于21845會提示用其他類型 。mysql行最大限制為65535字節,字符編碼為utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)存儲:varchar類型存儲數據的真實內容,不會用空格填充,如果'ab ',尾部的空格也會被存起來強調:varchar類型會在真實數據前加1-2Bytes的前綴,該前綴用來表示真實數據的bytes字節數(1-2Bytes最大表示65535個數字,正好符合mysql對row的最大字節限制,即已經足夠使用)如果真實的數據<255bytes則需要1Bytes的前綴(1Bytes=8bit 2**8最大表示的數字為255)如果真實的數據>255bytes則需要2Bytes的前綴(2Bytes=16bit 2**16最大表示的數字為65535)檢索:尾部有空格會保存下來,在檢索或者說查詢時,也會正常顯示包含空格在內的內容小結:
#常用字符串系列:char與varchar
注:雖然varchar使用起來較為靈活,但是從整個系統的性能角度來說,char數據類型的處理速度更快,有時甚至可以超出varchar處理速度的50%。因此,用戶在設計數據庫時應當綜合考慮各方面的因素,以求達到最佳的平衡
#其他字符串系列(效率:char>varchar>text)
TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT
BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB
BINARY系列 BINARY VARBINARY
text:text數據類型用于保存變長的大字符串,可以組多到65535 (2**16 ? 1)個字符。
mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 ? 1) characters.
longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 ? 1) characters.
枚舉類型與集合類型
字段的值只能在給定范圍中選擇,如單選框,多選框
enum 單選 只能在給定的范圍內選一個值,如性別 sex 男male/女female
set 多選 在給定的范圍內可以選擇一個或一個以上的值(愛好1,愛好2,愛好3...)
枚舉類型(enum)
An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
示例:
CREATE TABLE shirts (name VARCHAR(40),size ENUM('x-small', 'small', 'medium', 'large', 'x-large') ); INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');集合類型(set)
A SET column can have a maximum of 64 distinct members.
示例:
CREATE TABLE myset (col SET('a', 'b', 'c', 'd')); INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');?
轉載于:https://www.cnblogs.com/zhzhlong/p/9300124.html
總結
- 上一篇: 关于jQuery.click()函数
- 下一篇: linux tcpdump抓包,wire