目錄
前言:?
1,數據類型的分類
??編輯
?2 ,數值類型
2.1 tinyint類型
2.2??bit類型
?2.3 小數類型
2.3.1 float類型?
?2.3.2 decimal類型
?3,字符串類型
3.1 char
?3.2 varchar
3.3 char與varchar的比較
3.4日期和時間類型
?3.5 enum和set
前言:?
MySQL 是一個流行的開源關系型數據庫管理系統。它支持多種數據類型,用于存儲和管理數據。
MySQL提供了多種數據類型,合理選擇數據類型對存儲效率,查詢性能和數據 準確性至關重要,本篇對MySQL 支持的主要數據類型分類及詳細說明。
1,數據類型的分類
?
?
?
?2 ,數值類型
2.1 tinyint類型
tinyint大小為一個字節,無符號數的取值范圍在0~255,有符號數的取值范圍在-128~127。
使用示例:
- 創建一個包含tinyint數據類型的表
create table if not exists t1( num tinyint);
- ?向t1中插入數據
mysql> insert into t1 values(1);
Query OK, 1 row affected (0.01 sec)
?
mysql> insert into t1 values (-127);
Query OK, 1 row affected (0.01 sec)
?
mysql> insert into t1 values(-128);
Query OK, 1 row affected (0.00 sec)
- 打印t1表中的信息?
select * from t1;
?
- ?插入超出范圍的數字
mysql> insert into t1 values (-129);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
?
mysql> insert into t1 values(128);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql>
?
將tiny設置為無符號類型,此時的數據范圍就是0~255。
create table if not exists t2(?num tinyint unsigned);
插入數據:
?
總結:?
MySQL中,整型可以指定符號的,默認是有符號的,通過unsigned可以來標識字段類型為無符號類型。
MySQL也不支持 插入超出數據類型范圍的數,否則直接攔截。所以 可以保證插入的時候數據一定是合法的。在MySQL中,數據類型本身就是一種約束,所以無論使用者是否可以熟練的使用MySQL,這種約束都可以很好的保證數據是可預期的,完整的,合法的。?
2.2??bit類型
bit[(M)]:位字段類型。M表示每個值的位數,范圍從1到64。如果M被忽略,默認為1。
- 創建一個包含bit類型的數據表并插入數據
create table if not exists t3(id int,num bit);
insert into t3 values(1,0);
insert into t3 values(2,1);
insert into t3 values(3,2);//err,默認只能插入0或1
?
- 創建一個大小為8的bit類型數據表?
create table if not exists t4( id int,num bit(8));
insert into t4 values(1,25);
insert into t4 values(2,100);insert into t4 values(2,255);
insert into t4 values(2,256);//err,同樣不能越界?
?
?2.3 小數類型
?
2.3.1 float類型?
float[(m,d)][unsigned]:m指定顯示長度,d指定小數位數,占4個字節。
- 創建一個長度為4,小數部分長度為2的小數的數據表?
create table if not exists t5(id int,num float(4,2));
注:float(4,2)表示的數據范圍是-99.99~99.99,MySQL在保存值時會四舍五入。?
- 插入數據
insert into t5 values(1,-99.99);
insert into t5 values(2,0);
?insert into t5 values(3,99.99);
?insert into t5 values(3,99.991);
insert into t5 values(3,59.885);
insert into t5 values(3,100.00);//errinsert into t5 values(3,59.886);
?
?
同理,如果將float定義為unsigned無符號類型,那么float(4,2)的取值范圍時0~99.99.
?2.3.2 decimal類型
decimal[(m,d)][unsigned]:定點數m指定長度,d表示小數點的位數。
- decimal(5,2)表示 的數據范圍:-999.99~999.99
- decimal(5,2) unsigned表示的數據范圍:0~999.99
- float和decimal很像,但是有區別,表示的精度不一樣。
創建一個數據表,長度為10,小數部分為8,比較float和decimal。?
create table if not exists t6( num1 float(10,8), num2 decimaimal(10,8) );
insert into t6 values (23.12345612,23.12345612);
insert into t6 values (12.12345678,12.12345678);?
?
?我們看到在數據一樣的情況下,decimal的小數精度高于float。float表示的精度大約是7位。decimal整數最大位數m為65。支持小數最大位數d是30。如果d被省略,默認為0,如果m被省略,默認是10。?
?3,字符串類型
3.1 char
char[(L)]:固定長度字符串,L是可以存儲的長度,單位為字符,最大可以存儲255個字符 。
- 創建包含長度為2的字符串的數據表?
create table if not exists t7(id int,name char(2));
- 插入數據?
insert into t7 values(1,'張三');
insert into t7 values(2,'李四');
insert into t7 values(3,'王五');
?
char(2)表示可以存儲兩個字符,可以是字母或者漢字,但是不能超過255個 。?
?
?3.2 varchar
varchar[(L)]:可變長度字符,L表示字符長度,最大長度為65535個字節。
- 創建一個長度為6的字符串的數據表
create table if not exists t8(id int,name varchar(6));
varchar(6)表示可以存儲6給字符。
- 插入數據?
insert into t8 values(100,'hello');
insert into t8 values(100,'我愛你,中國');
insert into t8 values(100,'我愛敲代碼!!');//err
?
關于varchar(len),len到底是多大,和表的編碼密切相關。
- ?varchar長度可以指定為0~65535之間的值,但是有1~3個字節用來存儲數據的大小,所以說有效字節數是65532。
- 當我們表的編碼是utf8時,varchar(n)的參數n的最大值是65532/3=21844(因為utf8中,一個字符占3個字節),如果編碼是gbk,varchar(n)的參數n最大是65532/2=32766(因為gbk中,一個字符占個字節)。
?
3.3 char與varchar的比較
?
如何選擇定長或變長字符串:
- 如果數據確定長度都一樣,就使用定長(char),比如:身份證,手機號,md5。
- 如果數據長度有變化,就使用變長(varchar),比如:名字,地址,但是你要保證最長的能存的進去。
- 定長的磁盤空間比較浪費,但是效率高。
- 變長的磁盤空間比較節省,但是效率低。
- 定長的意義是,直接開辟好對應的空間。
- 變長的意義是,在不超過自定義范圍的情況下,用多少,開辟多少。
3.4日期和時間類型
?常見的日期有如下三個:
- date:日期'yyyy-mm-dd',占用3個字節
- datetime:時間日期格式'yyyy-mm-dd HH:ii:ss',表示范圍從1000到9999,占用8個字節。
- timestamp:時間戳,從1970年開始的yyyy-mm-dd HH:ii:ss格式和datetime完全一致,占用4個字節。表示現在 的時間。
- ?創建帶時間的數據表
create table if not exists birthday(t1 date,t2 datetime,t3 timestamp);
- ?插入數據
insert into birthday (t1,t2) values ('1997-7-1','2008-8-8 12:1:1');
?
?3.5 enum和set
enum:枚舉,單選類型
enum('選項1','選項2','選項3',...)
該設定只是提供了若干個選項的值,最終一個單元格中,實際只存儲了其中一個值;而且出于效率考慮,這些值實際存儲的是“數字”,因為這些選項的每個選項值依次對應如下數字:1,2,3,…最多65535個;
set:集合,多選類型
set(’選項值1‘,‘選項值2’,‘選項值3’,...)
該設定只是提供了若干個選項的值,最終一個單元格中,設計可存儲了其中任意多個值;而且出于效率考慮,這些值實際存儲的是“數字”,因為這些選項的每個選項值依次對應如下數字:1,2,4,8,16,32,…最多64個。
- 創建一個含有set的數據表?
create table votes(username varchar(30),?hobby set('登山','游泳','籃球','武術'),gender enum('男','女'));
- 插入數據?
insert into votes values ('雷鋒','登山,武術','男');
insert into votes values ('張三','登山,武術','男');
?insert into votes values ('李四','游泳','女');insert into votes values ('趙六','籃球','2');
insert into votes values ('王五','足球','男');//err
?
集合查詢使用find_in_set函數?

select * from votes where find_in_set('登山',hobby);?
?
?