MySQL資料庫應用總結(六)—MySQL資料庫數據類型和運算符(上)
SQL語法預覽:
創建表欄位數據類型:【create table 表名(欄位名稱 數據類型);】
插入欄位值:【insert into 表名 values (值1,值2…值n);】
查看格式化值:【select * 或【格式1,格式2…格式n】 from 表名;】
詳解:
一、 MySQL數據類型介紹
MySQL支持多種數據類型,主要有數值類型、日期類型、時間類型和字元串類型。
1. 整數類型
數據類型主要用來存儲數字,MySQL提供多種可供選擇的整數類型,用整數作為數據類型的欄位可以設置auto_increment自增約束條件。
案例:創建資料庫db_demo2,創建表tb_temp1,其中包含欄位a、b、c、d、e的數據類型分別為tinyint、smallint、mediumint、int(Integer)、bigint,SQL語句如下:
create database db_demo2;
use db_demo2;
create table tb_temp1(a tinyint,b smallint,c mediumint,d int,e bigint);
desc temp1;
執行結果如下:
2. 浮點和定點數據類型
MySQL中使用浮點數和定點數來表示小數。浮點有分為單浮點和雙浮點。
案例:創建數據表tb_temp2,其中包含欄位x、y、z的數據類型依次為float(5,1)、double(5,1)和decimal(5,1),向表中插入數據5.12、5.15和5.123,SQL語句:
create table tb_temp2(x float(5,1),y double(5,1),z decimal(5,1));
insert into tb_temp2 values(5.12,5.15,5.123);
執行結果如下:
3. 日期與時間類型
(1) YEAR
YEAR類型是一個單位元組類型,用於表示年,在存儲時只需要1個位元組。可以使用各種格式指定YEAR值,如下所示:
·以4位字元串或者4位數字格式表示的YEAR,範圍為1901~2155。輸入格式YYYY或者YYYY。
·以2位字元串格式表示的YEAR,範圍為00到99。00~69轉換為2000~2069;70~99轉換為1970~1999;
·以2位數字表示的YEAR值,範圍為1~99。1~69值是2001~2069;70~99範圍值轉換為1970~1999,而在這裡0值被轉換為0000;
案例:創建數據表tb_temp3,定義欄位類型為YEAR的欄位y,向表中插入數值2017,2017,0,00,77,10 ,78和11,SQL語句:
create table tb_temp3(y YEAR);
insert into tb_temp3 values(2017),(2017),(0),(00,(77),(10),(78),(11);
執行結果如下:
(2) TIME
TIME類型用於表示時間信息,在存儲時需要3個位元組。表示某一事件過去的時間和兩個事件之間的時間間隔。可以大於24甚至為負值。 ·
·D HH:MM:SS』格式的字元串。有HH:MM,D HH:MM ,D HH ,SS。D表示日,可以取0~34之間的值。在插入資料庫時D被轉換為小時保存(D*24+HH)。
·HHMMSS格式的數值,會自動分成HH:MM:SS但各自有取值範圍,超過則輸入不合法。
案例:創建數據表tb_temp4,定義欄位類型為TIME的欄位t,向表中插入數值10:05:05 ,23:23,2 10:10,3 02 ,10 ,101112,0,和106010,SQL語句:
create table tb_temp4(t TIME);
insert into tb_temp4 values(』10:05:05』),(,23:23,),(2 10:10),(3 02),(10),(101112),(0),(106010);
執行結果如下:
(3) DATE
DATE只用於輸入日期,沒有時間,在存儲時需要3個位元組。日期格式為:YYYY-MM-DD 。
·以YYYY-MM-DD或者YYYYMMDD字元串格式表示日期,取值範圍是1000-01-01』~9999-12-03。
·以YY-MM-DD或者YYMMDD字元串格式表示日期,取值範圍與年
數相關,00~69年值範圍是2000~2069,70~99年值範圍是1970~1999。
·以YY-MM-DD或者YYMMDD數字格式表示日期,取值範圍與年數
相關,00~69年值範圍是2000~2069,70~99年值範圍是1970~1999。
·使用current_date或者now(),插入當前系統日期。
案例:創建數據表tb_temp5,定義欄位類型為DATE的欄位d,向表中插入數值2017-12-02、20101010,99-09-09 ,000101 ,111111 ,121212和171203 ,SQL語句:
create table tb_temp5(d DATE);
insert into tb_temp5 values(2017-12-02),(20101010),(99-09-09』),(000101),(111111),(121212),(171203);
執行結果如下:
(4) DATETIME
DATETIME用於同時輸入日期和時間信息,在存儲時需要8個位元組。格式為:』』YYYY-MM-DD HH:MM:SS』, 只要符合格式使用字元串和數字類型均可。
·以YYYY-MM-DD HH:MM:SS或者YYYYMMDDHHMMSS字元串格式表示日期,取值範圍是1000-01-01 00:00:00~9999-12-03 23:59:59 。
·以YY-MM-DD HH:MM:SS或者YYMMDDHHMMSS字元串格式表示日期,取值範圍與年數相關,00~69年值範圍是2000~2069,,70~99年值範圍是1970~1999。
·以YYYYMMDDHHMMSS或者YYMMDDHHMMSS數字格式表示日期,取值範圍與年數相關,00~69年值範圍是2000~2069,,70~99年值範圍是1970~1999。
·使用now(),插入當前系統日期時間。
案例:創建數據表tb_temp6,定義欄位類型為DATETIME的欄位dt,向表中插入數值2017-12-02 20:33:33,20101010101010,09-09-09 09:09:09,121212121212』 和111111111111 SQL語句:
create table tb_temp6(dt DATETIME);
insert into tb_temp6 values(2017-12-02 20:33:33),(20101010101010),(09-09-09 09:09:09),(121212121212),(111111111111);
執行結果如下:
(5) TIMESTAMP
TIMESTAMP的顯示格式與DATETIME相同,顯示寬度是19個字元。存儲需要4個位元組,格式為:YYYY-MM-DD HH:MM:SS 。但是TIMESTAMP列的取值範圍小於DATETIME的取值範圍,為1970-01-01 00:00:01UTC~2038-01-19 03:14:07 UTC。其中UTC(Coordinated Universal Time)世界標準時間,因此在插入數據時要保證在合法取值範圍內。
案例:創建數據表tb_temp7,定義欄位類型為TIMESTAMP的欄位ts,向表中插入數值20170101010101 ,20050607080910,08-08-08 09:09:09,12@12@12 12@ 12@12,111111111111和now(),SQL語句:
create table tb_temp7(ts TIMESTAMP);
insert into tb_temp7 values(20170101010101),(20050607080910),(08-08-08
09:09:09),(12@12@12 12@12@12),(111111111111),(now());執行結果如下:
4. 字元串類型
字元串類型除了可以存儲字元串數據以外,還可以存儲其他數據,比如圖片、聲音和二進位數據。字元串可以進行區分或或者不區分大小寫的串比較。
MySQL中的字元串char、varchar、binary、varbinary、blob、tinytext、text、enum和set。
(1) char和varchar類型
char(M)為固定長度字元串,在定義時要指定字元串列長。當保存時在右側填充空格以達到指定長度。M表示列長度,當檢索時實際值尾部空格會自動刪除。
varchar(M)為長度可變的字元串,M表示列最大長度,但是保存時實際佔用空間為字元串實際長度加1。不管是保存還是檢索varchar的值時實際值尾部的空格都會保留。
案例:創建數據表tb_temp8,定義欄位ch和vch的數據類型依次為char(4)和varchar(4),向表中插入數據」ab 「 ,SQL語句:
create table tb_temp8(ch char(4),vch varchar(4));
insert into tb_temp8 values(ab 『,ab );
執行結果如下:
(2) text類型
text列保存非二進位字元串,如文章、評論等等。當保存和查詢text列值時,不刪除尾部空格。Text類型分為四種:tinytext、text、mediumtext和longtext。不同的text類型存儲空間和數據長度不同。
·tinytext:最大長度255(28~1)個字元的text列。
·text:最大長度為65535(216~1)個字元的text列。
·mediumtext:最大長度為16777215(224~1)個字元的text列。
·longtext:最大長度為4294967295或4GB(232~1)個字元的text列。
(3) enum類型
enum是一個字元串對象,其值為創建時在列規定中枚舉的一列值。Enum類型的欄位取值時只能在指定的枚舉列表中取,而且一次只能取一個。如果創建的成員中有空格,則其尾部的空格將自動刪除。Enum值在內部用整數表示,每個枚舉值均有一個索引值:列表值所允許的成員值從1開始編號,MySQL存儲的就是這個索引編號。枚舉最多可以有65535個元素。
例如:定義enum類型的列(null,",first,second,third),該列可以取值和每個值的索引如下表所示。
Enum 值依照列索引順序排列,並且空字元排在非空字元串之前,null值排在其他所有枚舉值之前。
案例:創建表tb_temp9,定義枚舉類型的列enum(first ,second』,third),查看列成員的索引值,SQL語句如下:
create table tb_temp9(enm enum(first,second,third));
insert into tb_temp9 values(first),(second),(third),(null);
執行結果如下:
(4) set類型
set類型是一個字元串對象,可以有另個或者多個值,set列最多可以有64個成員,其值為創建表時規定的一系列值。Set成員各值之間用逗號,隔開。語法格式如下:
set(值1,值2,…值n)
與enum類型相同,set的值在內部用整數表示,每一個值都有一個索引編號。當創建表時,set成員值得尾部空格將自動刪除。但與enum類型不同的是,enum類型的欄位只能從定義的列值中選擇一個插入,而set類型的列可以從定義的列值中選擇多個字元聯合插入。
如果插入set欄位的列值有重複,則MySQL自動刪除重複值;插入set欄位值順序並不重要,MySQL會在存入資料庫時,按照定義的順序顯示;如果插入了不正確的值,默認情況下,MySQL將忽視這些值,並給出警告。
案例:創建表tb_temp10,定義set類型欄位s,取值列表為(a,b,c,d),插入數據(a)、(a,b,a)、(c,a,d)、(a,x,b,y)。SQL語句如下:
create table tb_temp10(s set(a,b,c,d));
insert into tb_temp10 values(a),(a,b,a),(c,a,d);
執行結果如下:
5. 二進位類型
MySQL支持兩類字元型數據:文本字元串和二進位字元串。前面講解了存儲文本的字元串類型,今天將講解MySQL中存儲二進位數據的數據類型。
MySQL中的二進位數據類型有:bit、binary、varbinary、tinyblob、blob、mediumblob和longblob,今天講解這些二進位類型的特點和使用方法。
(1) bit類型
bit是位欄位類型。M表示值得位數,範圍為1~64。如果M被省略,默認值為1。如果為bit(M)列分配的值長度小於M位,在值得左邊用零填充。如bit(5)列分配一個值b101,其效果與分配b00101相同。Bit數據類型用來保存位欄位值,如以二進位的形式保存數據13,13的二進位為1101,在這裡需要位數至少4位的bit類型,既可以定義列類型為bit(4)。大於位數(M)的二進位數是不能插入bit(M)類型欄位中的。
案例:創建表tb_temp11,定義bit(4)類型欄位b,向表中插入數據3、10、18。SQL語句如下:
create table tb_temp11(b bit(4));
insert into tb_temp11 values(3),(10),(18);
執行結果如下:
(2) binary和varbinary類型
binary和varbinary類型類似於char和varchar,不同的是他們包含二進位位元組字元串。使用語法如下:
列名稱
binary(M)或者varbinary(M)Binary的長度是固定的,指定長度之後,不足最大長度的,將在右邊填充「 」補齊以達到指定長度(M)。
Varbinary類型的長度是可變的,其長度可以在0到最大值之間。如制定列數據類型為varbinary(20),如果插入的值得長度只有10,則實際存儲空間為10加1,即其實際佔用的空間為字元的實際長度加1。
案例:創建表tb-temp12,dingyi binary(3)類型額欄位b和varbinary(3)類型的欄位vb,並向表中插入數據"5",比較兩個欄位的存儲空間。SQL語句如下:
create table tb_temp12(b binary(3),vb varbinary(3));
insert into tb_temp12 values(5,5);
執行結果如下:
可以看到b欄位的數據長度為3,而vb欄位的數據長度僅為插入的一個字元長度1。B欄位和vb欄位的長度截然不同,因為b欄位不足的空間填充了" ",而vb欄位則沒有填充。
(3) blob類型
blob是一個二進位的大對象,用來存儲可變數量的數據。Blob類型分為四種:tinyblob、blob、mediumblob和longblob,他們可以容納的最大長度不同。
Blob列存儲的是二進位字元串(位元組字元串);text列存儲的是非二進位字元串(字元字元串)。Blob列沒有字符集,並且排序和比較基於列值位元組的數值,text列有一個字符集,並且根據字符集對值進行排序和比較。
未完待續...
推薦閱讀:
※許多人沒有理解透徹的一些基礎概念
※為什麼我不再看好MariaDB
※如何使用 MySQL workbench 生成 EER 圖?
※MySQL 8.0.0 發布
※MySQL資料庫的高可用性分析