MySQL資料型別和運算子(瞭解)
MySQL提供了多種資料型別,主要包括:數值型、字串型別、日期和時間型別
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:指的是整數和小數所能存的最多的位數 |
位型別 | 位元組 | 最小值 | 最大值 |
---|---|---|---|
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
注意:在除法運算和模運算中,如果除數為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時才是和 := 一樣,賦值的作用,其它都是關係運算符 等於 的作用。