1. 程式人生 > 其它 >MySQL資料型別和運算子(瞭解)

MySQL資料型別和運算子(瞭解)

資料型別

  MySQL提供了多種資料型別,主要包括:數值型、字串型別、日期和時間型別JSON型別。

MySQL中的數值型別

整型型別 位元組 最小值 最大值
TINYINT 1 有符號 -128 無符號 0 有符號 127 無符號 255
SMALLINT 2 有符號 -32768 無符號 0 有符號 32767 無符號 65535
MEDIUMINT 3 有符號 -8388608 無符號 0 有符號 8388607 無符號 16777215
INT、INTEGER 4 有符號 -2147483648 無符號 0 有符號 2147483647 無符號 4294967295
BEGINT
8 有符號 -9223372036854775808 無符號 0 有符號 9223372036854775807 無符號 18446744073709551615

 

浮點數型別 位元組 最小值 最大值
FLOAT 4 ±1.175494351E-38 ±3.402823466E+38
DOUBLE 8 ±2.2250738585072014E-308 ±1.7976931348623157E+308

 

定點數型別 位元組 描述
DECIMAL(M,D) M+2 最大取值範圍與DOUBLE相同,給定DECIMAL的有效取值範圍由M和D決定

       M:指的是整數和小數所能存的最多的位數

         D:指的是小數數字的位數,即M-D就是整數的位數

 

位型別 位元組 最小值 最大值
BIT(M) 1~8 BIT(1) BIT(64)

MySQL中的日期和時間型別

日期和時間型別 位元組 最小值 最大值 零值表示
DATE 4 1000-01-01 9999-12-31 0000-00-00 00:00:00
DATETIME 8 1000-01-01 00:00:00 9999-12-31 23:59:59 0000-00-00
TIMESTAMP 4 19700101080001 2038年的某個時刻 00000000000000
TIME 3 -838:59:59 838:59:59 00:00:00
YEAR 1 1901 2155 0000
  • 如果要用來表示年月日,通常用DATE來表示;
  • 如果要用來表示年月日時分秒,通常用DATETIME或者TIMESTAMP表示;
    • 相同點:可自動更新和初始化,預設顯示格式相同YYYY-MM-dd HH:mm:ss
    • timestamp的時間範圍是:'1970-01-01 00:00:01'UTC to'2038-01-19 03:14:07' UTC ,自動時區轉化,實際儲存毫秒數,4位元組儲存 
    • datetime的時間範圍:'1000-01-01 00:00:00' to '9999-12-31 23:59:59' ,不支援時區,8位元組儲存
  • 如果只用來表示時分秒,通常用TIME來表示;
  • 如果只是表示年份, 可以用YEAR來表示,它比DATE佔用更少的空間。
    • 預設的是4位格式,允許的值是1901~2155和0000。
    • 2位格式中,允許的值是70~69,表示從1970~2069年。
    • MySQL以YYYY格式顯示YEAR值(從5.5.27開始,2位格式的year已經不被支援)。

  注意:每種日期時間型別都有一個有效值範圍,如果超出這個範圍,在預設的SQLMode下,系統會進行錯誤提示,並將以零值來進行儲存。

字串型別

1、MySQL提供了多種對字元資料的儲存型別,不同的版本可能有所差異,以5.7版本為例,MySQL包括了CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等多種字串型別,如下表所示:

日期和時間型別 位元組 描述及儲存需求
CHAR(M) M M為0~255之間的整數
VARCHAR(M)   M為0~65535之間的整數,值的長度+1個位元組
TINYBLOB   允許長度0~255位元組,值的長度+1個位元組
BLOB   允許長度0~65535位元組,值的長度+2個位元組
MEDIUMBLOB   允許長度0~167772150位元組,值的長度+3個位元組
LONGBLOB   允許長度0~4294967295位元組,值的長度+4個位元組
TINYTEXT   允許長度0~255位元組,值的長度+2個位元組
TEXT   允許長度0~65535位元組,值的長度+2個位元組
MEDIUMTEXT   允許長度0~167772150位元組,值的長度+3個位元組
LONGTEXT   允許長度0~4294967295位元組,值的長度+4個位元組
VARBINARY(M)   允許長度0~M個位元組的變長位元組字串,值的長度+1個位元組
BINARY(M) M 允許長度0~M個位元組的定長位元組字串

2、CHAR和VARCHAR型別:

兩者的主要區別在於儲存方式不同:

CHAR列的長度固定為建立表時宣告的長度,而VARCHAR列中的值為可變長字串

在檢查的時候,CHAR列刪除尾部的空格,而VARCHAR則保留這些空格

  • 測試:建立測試表vc,並定義兩個欄位“v VARCHAR(4)”和“c CHAR(4)”;
  • v列和c列中同時插入字串“ab “;再給兩個欄位分別追加一個"+"字串。
    create table vc(
            v varchar(4),
            c char(4)
    )Engine=Innodb default charset=utf8;
    insert into vc values("ab ","ab ");
    select length(v),LENGTH(c) from vc;
    select concat(v,"+"),concat(c,"+") from vc;

        

3、BINARY和VARBINARY型別:

BINARYT和VARBINARY類似於CHAR和VARCHAR,不同的是它們包含二進位制字串而不包含非二進位制字串。

4、ENUM型別:

ENUM中文名稱叫列舉型別,它的值範圍需要在建立表時通過列舉方式顯示指定,對1~255個成員的列舉需要1個位元組儲存,對於255~65535個成員,需要2個位元組來儲存。最多允許65535個成員。

  • 測試:定義gender欄位為列舉型別,成員為”M“和”F“;
    create table t (gender enum('M','F'));

5、SET型別:

SET和ENUM型別非常類似,也是一個字串物件,裡面可以包含0~64個成員。根據成員的不同,儲存上也有所不同。

1~8成員的集合,佔1個位元組

9~16成員的集合,佔2個位元組

17~24成員的集合,佔3個位元組

25~32成員的集合,佔4個位元組

33~64成員的集合,佔8個位元組

注意:

SET和ENUM除了儲存以外,最主要的區別在於SET型別一次可以行取多個成員,而ENUM則只能選一個。

SET中重複值只取一次

超出範圍的內值不允許插入操作

JSON型別

1、JSON型別比字元型別有如下優點:

JSON資料型別會自動校驗資料是否為JSON格式,如果不是JSON格式資料,則會報錯;

MySQL提供了一組操作JSON資料的內建函式,可以方便地提取各類資料,可以修改特定的鍵值;

優化的儲存格式,儲存在JSON列中的JSON資料被轉換成內部的儲存格式,允許快速讀取;

簡單地說,JSON實際就是Javascript的一個子集,支援的資料型別包括

NUMBER、STRING、BOLLEAN、NULL、ARRAY、OBJECT共6種,一個JSON中的元素可以是這6種類型元素的任意組合;

BOOLEAN:true/false

NULL:null

字串和日期型別:用雙引號引起來

ARRAY:括號引起來

OBJECT:KV,要用大括號引起來

注意:JSON,資料型別對於大小寫是敏感的,常見的null、true、false必須是小寫才合適。

2、必須要使用navicat 12.1.x 版本才能正常建立json 型別的欄位

navicat 12.1.x 以下版本 型別手動寫json,也可以建立表成功,但是查詢結構顯示不了,需要使用mysql自帶客戶端查詢: select * from 表名稱 where json_contains(欄位名稱,'包含的值');

如: select * from test where json_contains(dd,'1');

算術運算子

1、+:運算子用於獲得一個或多個值的和;

2、-:運算子用於從一個值中減去另一個值;

3、*:運算子使數字相乘,得到兩個或多個值的乘積;

4、/:運算子用一個值除以另一個值得到商;DIV

5、%:運算子用一個值除以另外一個值得到餘數;MOD

注意:在除法運算和模運算中,如果除數為0,將是非法除數,返回結果為NULL。

比較運算子

1、“=”運算子:用於比較運算子兩側的運算元是否相等,如果兩側運算元相等,則返回值為1,否則為0。注意NULL不能用於“=”比較。

2、“<>”運算子:和“=”相反,如果兩側運算元不等,則值為1,否則為0。NULL不能用於“<>”比較。

3、“<=>”運算子:和”=“類似,在運算元相等時值為1,不同之處在於即使操作的值為NULL也可以正確比較。

4、”<”運算子:當左側運算元小於右側運算元時,其返回值為1,否則其值為0。

5、“<=”運算子:當左側運算元小於等於右側運算元時,其返回值為1,否則返回值為0。

6、“>”運算子:當左側運算元大於右側運算元時,其返回值為1,否則返回值為0。

7、”>=”運算子:當左側操作大於等於右側運算元時,其返回值為1,否則返回值為0。

8、”BETWEEN“運算子的使用格式為“a BETWEEN min AND max”,當a大於等於min並且小於等於max,則返回值為1,否則返回0。

9、”IN“運算子使用的格式為”a IN(value1,value2...)“,當a的值存在於列表中時,則整個比較表示式返回的值為1,否則返回0。

10、”IS NULL“運算子的使用格式為”a IS NULL“,當a的值為NULL,則返回值為1,否則返回值為0。

11、”IS NOT NULL“運算子的使用格式為”a IS NOT NULL“,當a的值為不為NULL,則返回值為1,否則返回值為0。

12、”LIKE“運算子的使用格式為”a LIKE %123%“,當a中含有字串”123“時,則返回值為1,否則返回值0。

13、”REGEXP“運算子的使用格式為”str REGEXP str_pat“,當字串中含有str_pat相匹配的字串,則返回值為1,否則返回0

LIKE 和 REGEXP之間的重要差別 LIKE 匹配整個列,如果被匹配的文字在列值中出現,LIKE 將不會找到它,相應的行也不會被返回(除非使用萬用字元)。而 REGEXP 在列值內進行匹配,如果被匹配的文字在列值中出現,REGEXP 將會找到它,相應的行將被返回,並且 REGEXP 能匹配整個列值(與 LIKE 相同的作用)。

邏輯運算子

1、“NOT” 或 “!” 表示邏輯非。

2、“AND” 或 “&&” 表示邏輯與運算。

3、“OR” 或 “||” 表示邏輯或運算。

4、“XOR” 表示邏輯異或。

位運算子

1、“&” 位與:對多個運算元的二進位制位做邏輯與操作。

2、“|” 位或:對多個運算元的二進位制位做邏輯或操作。

3、“^” 位異或:對運算元的二進位制位做異或操作 。

4、“~” 位取反:對運算元的二進位制位做NOT操作。

5、“>>” 位右移:對左運算元向右移動右運算元指定的位數。

6、“<<” 位左移:對左運算元向左移動右操作烽指定的位數。

運算子的優先順序

優先順序順序 描述及儲存需求
1 :=
2 ||、OR、XOR
3 &&、AND
4 NOT
5 BETWEEN、CASE、WHEN、THEN、ELSE
6 =、<=>、>=、>、<=、<、<>、!=、IS、LIKE、REGEXP、IN
7 |
8 &
9 <<、>>
10 -、+
11 *、/、DIV、%、MOD
12 ^
13 -(一元減號)、~(一元位元反轉)
14

:= 和 = 運算子在大部分場景下並無區別,但 := 更為全場景些。

= 只有在 set 和update時才是和 := 一樣,賦值的作用,其它都是關係運算符 等於 的作用。

:= 不只在 set 和 update 時賦值的作用,在 select 也是賦值的作用。