1. 程式人生 > >MariaDB 資料型別與運算子(4)

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.建立tempdt欄位型別為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)


MariaDB 運算子型別

算術運算子

比較運算子

邏輯運算子

移位運算子

運算優先順序

MariaDB 常用函式(拓展)

數學函式

字串函式

日期時間函式

條件判斷函式

系統資訊函式

加密解密函式

其他通用函式