MariaDB 資料型別與運算子(4)
MariaDB資料庫管理系統是MySQL的一個分支,主要由開源社群在維護,採用GPL授權許可MariaDB的目的是完全相容MySQL,包括API和命令列,MySQL由於現在閉源了,而能輕鬆成為MySQL的代替品.在儲存引擎方面,使用XtraDB來代替MySQL的InnoDB,MariaDB由MySQL的創始人Michael Widenius主導開發,他早前曾以10億美元的價格,將自己建立的公司MySQL AB賣給了SUN,此後,隨著SUN被甲骨文收購MySQL的所有權也落入Oracle的手中.MariaDB名稱來自MichaelWidenius的女兒Maria的名字.
資料庫表由多列欄位構成,每一個欄位指定了不同的資料型別.指定欄位的資料型別之後,也就決定了向欄位插入的資料內容,例如,當要插入數值的時候,可以將它們儲存為整數型別,也可以將它們儲存為字串型別.不同的資料型別也決定了MySQL在儲存它們的時候使用的方式,以及在使用它們的時候選擇什麼運算子號進行運算,下面的小結內容將介紹,常用的資料型別,和常用的運算子,在最後再看即可常用的MySQL系統函式的使用.
MySQL支援多種資料型別,主要分為幾大類,包括:數值型別,日期時間型別,和字串型別等.
數值型別(int):包括TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT
數值型別(float):包括FLOAT,DOUBLE,DECIMAL
日期時間型(time):包括YEAR,TIME,DATE,DATETIME,TIMESTAMP
字串型別(string):包括CHAR,VARCHAR,BINARY,VARBINARY,BLOB,TEXT,ENUM,SET
MariaDB 資料型別
◆整數資料型別◆
數值型型別主要用來儲存數字,MySQL提供了多種數值資料型別,不同的資料型別提供不同的取值範圍,可以儲存的值範圍越大,其所需要的儲存空間也會越大,MySQL主要提供的整形有:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,整數型別的屬性欄位可以新增AUTO_INCREMENT
型別名稱 | 說明資訊 | 儲存佔比 |
---|---|---|
TINYINT | 很小的整數 | 1個位元組 |
SMALLINT | 小的整數 | 2個位元組 |
MEDIUMINT | 中等大小整數 | 3個位元組 |
INT | 普通大小整數 | 4個位元組 |
BIGINT | 大整數 | 8個位元組 |
上表可看出,不同型別的資料位元組是不同的,整數型別的取值範圍也是固定的,基本上分為有符號和無符號型,下表就是他們的相應取值範圍,僅供參考:
資料型別 | 有符號 | 無符號 |
---|---|---|
TINYINT | -128-127 | 0-255 |
SMALLINT | 32768-32767 | 0-65535 |
MEDIUMINT | -8388608-8388607 | 0-16777215 |
INT | -2147483648-2147483647 | 0-4294967295 |
BIGINT | 這個範圍不多說,(大) | 0-無法形容的大 |
例項1: 建立一個整數型別的表.
MariaDB [lyshark]> create table myint
-> (
-> uid int(10),
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.00 sec)
以上是uid就是一個整數型別的欄位,注意後面的(10)意思是指定能夠顯示的數值中數字的個數.
例項2: 分別建立整形的資料型別欄位看看.
MariaDB [lyshark]> create table temp
-> (
-> a tinyint,
-> b smallint,
-> c mediumint,
-> d int,
-> e bigint
-> );
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> desc temp;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| a | tinyint(4) | YES | | NULL | |
| b | smallint(6) | YES | | NULL | |
| c | mediumint(9) | YES | | NULL | |
| d | int(11) | YES | | NULL | |
| e | bigint(20) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
◆浮點數和定點數◆
在MySQL中浮點數和定點數都是用來表示小數的,浮點數型別有兩種:單精度浮點數(FLOAT)和雙精度浮點數(DOUBLE),定點型別的話只有一種(DECIMAL),下表是這幾個數值的說明資訊:
型別名稱 | 說明資訊 | 儲存佔比 |
---|---|---|
FLOAT | 單精度浮點數 | 4個位元組 |
DOUBLE | 雙精度浮點數 | 8個位元組 |
DECIMAL | 壓縮的定點數 | M+2個位元組 |
例項: 建立temp
表,其中欄位x,y,z
資料型別分別是 float(5.1) double(5.1) decimal(5.1)
並向表中插入一些資料.
MariaDB [lyshark]> create table temp
-> (
-> x float(5,1),
-> y double(5,1),
-> z decimal(5,1)
-> );
Query OK, 0 rows affected (0.00 sec)
向表中插入資料,並檢視結果,MySQL預設自動截斷小數點後面的資料,具體截斷位數由計算機硬體和作業系統決定.
MariaDB [lyshark]> insert into temp values(5.12,5.22,5.123);
Query OK, 1 row affected, 1 warning (0.01 sec)
MariaDB [lyshark]> select * from temp1;
+------+------+------+
| x | y | z |
+------+------+------+
| 5.1 | 5.2 | 5.1 |
+------+------+------+
1 row in set (0.00 sec)
MariaDB [lyshark]>
◆日期與時間型別◆
MySQL中有多種表示日期的資料型別,主要有LDATETIME、DATE、TIME和YEAR.例如,當只記錄年資訊的時候,可以只使用 YEAR型別而沒有必要使用DATE,每一個型別都有合法的取值範圍,當指定確實不合法的值時系統將"0"值插入到資料庫中,下面先來看一下他的型別說明吧:
型別名稱 | 日期格式 | 日期範圍 | 儲存需求 |
---|---|---|---|
YEAR | YYYY | 1901-2155 | 1位元組 |
TIME | HH:MM:SS | -838:59:59-838:59:59 | 3位元組 |
DATE | YYYY-MM-DD | 1000-01-01-9999-12-3 | 3位元組 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00-9999:12-31 23:59:59 | 8位元組 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 UTC-2038-01-19 03:14:07 UTC | 4位元組 |
YEAR型別: 主要用於儲存一個年份,例如:1997 2018
1.建立temp
表,定義資料型別為year
的欄位x
,並向表中插入資料.
MariaDB [lyshark]> create table temp(x year); #建立一個year型別的欄位
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> desc temp;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| x | year(4) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.01 sec)
MariaDB [lyshark]> insert into temp values(2018),("2020"); #插入一些資料:注意必須是1901-2155之間的數
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> select * from temp;
+------+
| x |
+------+
| 2018 |
| 2020 |
+------+
2 rows in set (0.00 sec)
TIME型別:主要用於儲存時間,例如:12:12:21
1.建立temp1
表,定義資料型別為time
的欄位x
,並向表中插入資料.
MariaDB [lyshark]> create table temp1( #建立一個time型別的欄位
-> x time
-> );
Query OK, 0 rows affected (0.01 sec)
MariaDB [lyshark]> desc temp1;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| x | time | YES | | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)
MariaDB [lyshark]> insert into temp1 values('11:22:05'),('23:23'),('20'); #分別插入資料:注意(%HH-%MM-%SS)
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> select * from temp1;
+----------+
| x |
+----------+
| 11:22:05 |
| 23:23:00 |
| 00:00:20 |
+----------+
3 rows in set (0.00 sec)
2.當然啦我們可以簡寫省略冒號.
MariaDB [lyshark]> create table temp1(x time);
Query OK, 0 rows affected (0.01 sec)
MariaDB [lyshark]> insert into temp1 values('102231');
Query OK, 1 row affected (0.00 sec)
MariaDB [lyshark]> select * from temp1;
+----------+
| x |
+----------+
| 10:22:31 |
+----------+
1 row in set (0.00 sec)
3.向temp
表中的x
欄位插入當前系統執行時間,通過函式(CURRENT_TIME),(NOW()
取出.
MariaDB [lyshark]> select * from temp;
Empty set (0.00 sec)
MariaDB [lyshark]> insert into temp values (CURRENT_TIME),(NOW());
Query OK, 2 rows affected, 1 warning (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 1
MariaDB [lyshark]> select * from temp;
+----------+
| x |
+----------+
| 21:27:43 |
| 21:27:43 |
+----------+
2 rows in set (0.00 sec)
DATE型別:Date型別主要用於儲存年月日,例如:1997-10-05
1.建立temp
表,表中是date
型別的x
欄位,並插入一條資料.
MariaDB [lyshark]> create table temp(x date); #建立一個date型別的欄位
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> desc temp;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| x | date | YES | | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)
MariaDB [lyshark]> insert into temp values('1997-10-05'),('20180523'); #插入一些資料
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> select * from temp;
+------------+
| x |
+------------+
| 1997-10-05 |
| 2018-05-23 |
+------------+
2 rows in set (0.00 sec)
2.向temp
表中插入系統當前日期,通過函式(CURRENT_DATE()),(NOW())
取出系統日期.
MariaDB [lyshark]> select * from temp;
+------------+
| x |
+------------+
| 1997-10-05 |
| 2018-05-23 |
+------------+
2 rows in set (0.00 sec)
MariaDB [lyshark]> insert into temp values(CURRENT_DATE()),(NOW()); #取出系統當前日期並插入
Query OK, 2 rows affected, 1 warning (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 1
MariaDB [lyshark]> select * from temp;
+------------+
| x |
+------------+
| 1997-10-05 |
| 2018-05-23 |
| 2018-06-16 |
| 2018-06-16 |
+------------+
4 rows in set (0.00 sec)
DATATIME:DateTime型別用於儲存日期和時間,例如:2018-01-24 22:12:24
1.建立temp
表dt
欄位型別為datetime
,並插入一條資料.
MariaDB [lyshark]> create table temp(dt datetime);
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> desc temp;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| dt | datetime | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
1 row in set (0.00 sec)
MariaDB [lyshark]> insert into temp values('1997-05-10 10:22:14'),('20180616220101'); #插入日期時間
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> select * from temp;
+---------------------+
| dt |
+---------------------+
| 1997-05-10 10:22:14 |
| 2018-06-16 22:01:01 |
+---------------------+
2 rows in set (0.00 sec)
2.取系統當前日期並插入temp
表的dt
欄位.
MariaDB [lyshark]> select * from temp;
+---------------------+
| dt |
+---------------------+
| 1997-05-10 10:22:14 |
| 2018-06-16 22:01:01 |
+---------------------+
2 rows in set (0.00 sec)
MariaDB [lyshark]> insert into temp values(now()); #取系統日期插入temp表的dt欄位
Query OK, 1 row affected (0.00 sec)
MariaDB [lyshark]> select * from temp;
+---------------------+
| dt |
+---------------------+
| 1997-05-10 10:22:14 |
| 2018-06-16 22:01:01 |
| 2018-06-16 22:03:39 |
+---------------------+
3 rows in set (0.00 sec)
MariaDB [lyshark]>
TIMESTAMP型別:TimeStamp與DateTime相同,但是TimeStamp是使用的UTC(世界標準時間)
1.建立temp
表並插入timestamp
型別的x
欄位,插入一條資料.
MariaDB [lyshark]> create table temp(x timestamp); #建立一個timestamp型別的欄位
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> desc temp;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| x | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
1 row in set (0.00 sec)
MariaDB [lyshark]> insert into temp values('2018-06-16 22:24:00'); #插入一條時間記錄
Query OK, 1 row affected (0.01 sec)
MariaDB [lyshark]> select *from temp;
+---------------------+
| x |
+---------------------+
| 2018-06-16 22:24:00 |
+---------------------+
1 row in set (0.00 sec)
MariaDB [lyshark]> set time_zone='+12:00' #將時間上調12小時
-> ;
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> select * from temp; #再次查詢已經是第二天了
+---------------------+
| x |
+---------------------+
| 2018-06-17 02:24:00 |
+---------------------+
1 row in set (0.00 sec)
◆文字字串型別◆
字串型別用來儲存字串資料,除了可以儲存字串資料之外,還可以儲存其他資料,比如圖片和聲音的二進位制資料.MySQL支援兩類字元型資料:文字字串和二進位制字串,本小節主要介紹文字字串型別,文字字串可以進行區分或者不區分大小寫的串比較,另外還可以進行模式匹配查詢.MysQL中文字字串型別指CHAR,VARCHAR,TEXT,ENUM和SET,如下表所示.
型別名稱 | 說明資訊 | 儲存需求 |
---|---|---|
CHAR | 固定長度非二進位制字串 | M位元組,1<=M<=255 |
VARCHAR | 變長非二進位制字串 | L+1位元組 |
TIMYTEXT | 非常小的非二進位制字串 | L+1位元組 |
TEXT | 小的非二進位制字串 | L+2位元組 |
MEDIUMTEXT | 中等非二進位制字串 | L+3位元組 |
LONGTEXT | 大的非二進位制字串 | L+4位元組 |
ENUM | 列舉型別 | l或2個位元組 |
SET | SET成員型別 | 1,2,3,4或8個位元組 |
CHAR和VARCHAR:定長和不定長字串型別
CHAR和VARCHAR的長度區別:
● CHAR是一種定長字串,它的長度在初始化時就被固定比如說:char(10)則固定分配10個字元的長度,如果使用了CHAR型別,不論你的資料填充多少都會消耗4位元組儲存空間.
● VARCHAR是一種不定長字串,它的長度取決於你輸入的字元數,使用VARCHAR的話,它會動態的分配空間大小,但最大也不能超過定義的長度
1.定義一個temp
表,裡面有兩個欄位分別是ch,vch
型別是char(4)
和varchar(4)
插入資料檢視區別.
MariaDB [lyshark]> create table temp
-> (
-> ch char(4),
-> vch varchar(4)
-> );
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> desc temp;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| ch | char(4) | YES | | NULL | |
| vch | varchar(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
MariaDB [lyshark]> insert into temp values('xy ','xy ');
Query OK, 1 row affected (0.01 sec)
MariaDB [lyshark]> select *from temp;
+------+------+
| ch | vch |
+------+------+
| xy | xy |
+------+------+
1 row in set (0.00 sec)
TEXT型別:用於儲存非二進位制字串,如文章內容評論內容等,當儲存或查詢text列的值時,不刪除尾部空格.
關於TEXT型別的取值範圍:
● TINYTEXT 最大長度為
255(2^8-1)
字元的TEXT列.
● TEXT 最大長度為65535(2^16-1)
字元的TEXT列.
● MEDIUMTEXT 最大長度為16777215(2^24-1)
字元的TEXT列.
● LONGTEXT 最大長度為4294967295
字元的TEXT列.
1.建立一個表temp1
,並建立text
欄位,寫入一段話看看.
MariaDB [lyshark]> create table temp1(x text);
Query OK, 0 rows affected (0.02 sec)
MariaDB [lyshark]> desc temp1;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| x | text | YES | | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)
MariaDB [lyshark]> insert into temp1 values('hello lyshark')
-> ;
Query OK, 1 row affected (0.00 sec)
MariaDB [lyshark]> select * from temp1;
+---------------+
| x |
+---------------+
| hello lyshark |
+---------------+
1 row in set (0.00 sec)
ENUM列舉型別:enum的值根據列索引順序排列,並且空字串排在非空字串前,NULL值排在其他所有的列舉值前面
1.來看一個列舉的小例子,注意:列舉預設標號從1開始.
MariaDB [lyshark]> create table temp2(enm enum('first','second','thire'));
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> desc temp2;
+-------+--------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------------+------+-----+---------+-------+
| enm | enum('first','second','thire') | YES | | NULL | |
+-------+--------------------------------+------+-----+---------+-------+
1 row in set (0.00 sec)
MariaDB [lyshark]> insert into temp2 values('1'),('2'),('3'),(NULL);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> select * from temp2;
+--------+
| enm |
+--------+
| first |
| second |
| thire |
| NULL |
+--------+
4 rows in set (0.00 sec)
MariaDB [lyshark]>
set集合:但在宣告成集合時,其取值就已經固定了
MariaDB [lyshark]> create table temp3(s set('a','b','c','d')); #首先定義了一個集合,元素有abcd
Query OK, 0 rows affected (0.01 sec)
MariaDB [lyshark]> desc temp3;
+-------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| s | set('a','b','c','d') | YES | | NULL | |
+-------+----------------------+------+-----+---------+-------+
1 row in set (0.00 sec)
MariaDB [lyshark]>
MariaDB [lyshark]> insert into temp3 values('a'),('a,b,c'),('a,b,c,d'); #分別插入3個不同的集合,看看
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> select * from temp3;
+---------+
| s |
+---------+
| a |
| a,b,c |
| a,b,c,d |
+---------+
3 rows in set (0.00 sec)
MariaDB [lyshark]> insert into temp3 values('a,'f''); #在插入f時報錯,因為集合中定義是沒有f
ERROR 1064 (42000): You have an error in your SQL syntax;
◆二進位制字串型別◆
在MySQL中的二進位制資料型別有:BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB,LONGBLOB,老樣子,看下面的表格,就清晰啦.
型別名稱 | 說明資訊 | 儲存需求 |
---|---|---|
BIT | 位欄位型別 | (M+7/8)個位元組 |
BINARY | 固定長度二進位制字串 | M個位元組 |
VARBINARY | 可變長二進位制字串 | M+1位元組 |
TINYBLOB | 非常小的BLOB | L+1位元組 |
BLOB | 小BLOB | L+2位元組 |
MEDIUMBLOB | 中等大小的BLOB | L+3位元組 |
LONGBLOB | 非常大的BLOB | L+4位元組 |
bit型別:位欄位型別,也就是說插入的資料會被轉換成101011011這樣的格式
1.定義並插入資料測試,x+0
表示將二進位制結果轉換為對應的數字的值,bin()
函式將數字轉換為2進位制.
MariaDB [lyshark]> create table temp5(x bit(4));
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> desc temp5;
+-------+--------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| x | bit(4) | YES | | NULL | |
+-------+--------+------+-----+---------+-------+
1 row in set (0.00 sec)
MariaDB [lyshark]> insert into temp5 values(100),(115),(10);
Query OK, 3 rows affected, 2 warnings (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 2
MariaDB [lyshark]> select BIN(x+0) from temp5;
+----------+
| BIN(x+0) |
+----------+
| 1111 |
| 1111 |
| 1010 |
+----------+
3 rows in set (0.00 sec)
BINARY和VARBINARY型別: 定長與不定長二進位制字串型別.
1.binary型別是一個定長,二進位制位元組字串型別,在欄位不足制定位元組是會自動在後面填\0.
2.varbinary型別是一個可變長,二進位制位元組字串型別,而vb欄位不會填充.
建立一個temp10
,分別有兩個欄位b,vb
型別分別是binary(3)
和varbinary(30)
MariaDB [lyshark]> create table temp10(
-> b binary(3),
-> vb varbinary(30)
-> );
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> desc temp10;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| b | binary(3) | YES | | NULL | |
| vb | varbinary(30) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
MariaDB [lyshark]> insert into temp10 values(5,5);
Query OK, 1 row affected (0.01 sec)
MariaDB [lyshark]> select length(b),length(vb) from temp10; #可以看到b佔用3位元組,而vb是隻佔用1位元組
+-----------+------------+
| length(b) | length(vb) |
+-----------+------------+
| 3 | 1 |
+-----------+------------+
1 row in set (0.00 sec)