DB version: 5.7.25-log
目錄:
一、字符串常規(guī)函數(shù)
二、字符串比較函數(shù)
三、正則表達(dá)式
四、字符集和排序規(guī)則函數(shù)
一、字符串常規(guī)函數(shù)
ASCII(str)返回字符串中第一個(gè)字符的ascii碼,如果字符串為空,則返回0,為NULL,則返回NULL。只適合單字節(jié)的字符,不適用于多字節(jié),如漢字。
多字節(jié)用 ORD(str)。
mysql> select ascii('123');
+--------------+
| ascii('123') |
+--------------+
| 49 |
+--------------+
mysql> select ascii(1);
+----------+
| ascii(1) |
+----------+
| 49 |
+----------+
mysql> select ascii('a');
+------------+
| ascii('a') |
+------------+
| 97 |
+------------+
mysql> select ascii('abc');
+--------------+
| ascii('abc') |
+--------------+
| 97 |
+--------------+
mysql> select ascii('');
+-----------+
| ascii('') |
+-----------+
| 0 |
+-----------+
mysql> select ascii(NULL);
+-------------+
| ascii(NULL) |
+-------------+
| NULL |
+-------------+
ORD(str) 如果字符串str的第一個(gè)字符是多字節(jié)字符,則返回該字符的代碼,該代碼使用以下公式根據(jù)其組成字節(jié)的數(shù)值計(jì)算得出:
(1st byte code) + (2nd byte code * 256) + (3rd byte code * 256^2) ...
mysql> select ord('我');
+-----------+
| ord('我') |
+-----------+
| 15108241 |
+-----------+
mysql> select ord('我是中國(guó)人');
+-------------------+
| ord('我是中國(guó)人') |
+-------------------+
| 15108241 |
+-------------------+
計(jì)算公式:
mysql> SELECT hex(CONVERT( '我' USING utf8 ));
+---------------------------------+
| hex(CONVERT( '我' USING utf8 )) |
+---------------------------------+
| E68891 |
+---------------------------------+
將三個(gè)字節(jié)對(duì)應(yīng)的編碼轉(zhuǎn)為10進(jìn)制再乘以256的次方。
第一個(gè)字節(jié) 91 :(9*16+1)
第二個(gè)字節(jié) 88 :(8*16+8)*256
第三個(gè)字節(jié) E6 :(14*16+6)*256*256
mysql> select (9*16+1)+(8*16+8)*256+(14*16+6)*256*256 as res;
+----------+
| res |
+----------+
| 15108241 |
+----------+
如果字符串str的第一個(gè)字符是單字節(jié)字符,則返回與ASCII(str) 相同的值。
mysql> select ord('a我是中國(guó)人');
+--------------------+
| ord('a我是中國(guó)人') |
+--------------------+
| 97 |
+--------------------+
BIN(N) 返回N的二進(jìn)制值的字符串表示形式,其中N是一個(gè)BIGINT數(shù)字。最大可為2^64。
- 如果N為NULL或'',則返回NULL;
- 如果N為非數(shù)字,則返回0。
mysql> select bin(1234);
+-------------+
| bin(1234) |
+-------------+
| 10011010010 |
+-------------+
mysql> select bin(NULL);
+-----------+
| bin(NULL) |
+-----------+
| NULL |
+-----------+
mysql> select bin('');
+---------+
| bin('') |
+---------+
| NULL |
+---------+
mysql> select bin('w');
+----------+
| bin('w') |
+----------+
| 0 |
+----------+
mysql> select bin('我');
+-----------+
| bin('我') |
+-----------+
| 0 |
+-----------+
BIT_LENGTH(str) 以位為單位返回字符串str的長(zhǎng)度。
gbk 編碼下一個(gè)漢字占兩個(gè)字節(jié)
mysql> select bit_length(CONVERT( '我' USING gbk )) ;
+----------------------------------------+
| bit_length(CONVERT( '我' USING gbk )) |
+----------------------------------------+
| 16 |
+----------------------------------------+
utf8 編碼下一個(gè)漢字占三個(gè)字節(jié),24位
mysql> select bit_length(CONVERT( '我' USING utf8mb4 ));
+--------------------------------------------+
| bit_length(CONVERT( '我' USING utf8mb4 )) |
+--------------------------------------------+
| 24 |
+--------------------------------------------+
emoji表情只能用 utf8mb4保存,且占四個(gè)字節(jié),32位
mysql> select bit_length(CONVERT( '??' USING utf8mb4 )) ;
+------------------------------------------+
| bit_length(CONVERT( '?' USING utf8mb4 )) |
+------------------------------------------+
| 32 |
+------------------------------------------+
CHAR(N) 返回N整數(shù)部分在ascii碼表對(duì)應(yīng)的字符(N為小數(shù),則舍棄小數(shù)位)
1.NULL被跳過(guò),不返回任何東西 ;
2.ascii碼只有256(0-255)個(gè),超過(guò)255的數(shù)字將被轉(zhuǎn)換成多個(gè)字節(jié)結(jié)果;
3.默認(rèn)返回二進(jìn)制字符集,可用using語(yǔ)句進(jìn)行指定字符集。
mysql> SELECT CHAR(77,121,null,83,81,'76');
+------------------------------+
| CHAR(77,121,null,83,81,'76') |
+------------------------------+
| MySQL |
+------------------------------+
mysql> SELECT CHAR(81,81.12,'81.3');
+-----------------------+
| CHAR(81,81.12,'81.3') |
+-----------------------+
| QQQ |
+-----------------------+
超過(guò)255被轉(zhuǎn)為多字節(jié)
CHAR(256) 等價(jià)于 CHAR(1,0),CHAR(65535)等價(jià)于CHAR(255,255),以此類推
mysql> SELECT HEX(CHAR(255)),HEX(CHAR(256)),HEX(CHAR(1,0)),HEX(CHAR(65535)),HEX(CHAR(255,255)),HEX(CHAR(65536)),HEX(CHAR(1,0,0));
+----------------+----------------+----------------+------------------+--------------------+------------------+------------------+
| HEX(CHAR(255)) | HEX(CHAR(256)) | HEX(CHAR(1,0)) | HEX(CHAR(65535)) | HEX(CHAR(255,255)) | HEX(CHAR(65536)) | HEX(CHAR(1,0,0)) |
+----------------+----------------+----------------+------------------+--------------------+------------------+------------------+
| FF | 0100 | 0100 | FFFF | FFFF | 010000 | 010000 |
+----------------+----------------+----------------+------------------+--------------------+------------------+------------------+
如果給出了USING并且結(jié)果字符串對(duì)于給定的字符集是非法的,則會(huì)發(fā)出警告。
如果啟用了嚴(yán)格的SQL模式,則CHAR()的結(jié)果將為NULL。
mysql> SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));
+---------------------+--------------------------------+
| CHARSET(CHAR(0x65)) | CHARSET(CHAR(0x65 USING utf8)) |
+---------------------+--------------------------------+
| binary | utf8 |
+---------------------+--------------------------------+
CHARACTER_LENGTH(str) 是CHAR_LENGTH()的同義詞,見(jiàn)下
CHAR_LENGTH(str)返回字符串str的長(zhǎng)度,以字符為單位。不論多字節(jié)還是單字節(jié)字符均算作單個(gè)字符。
mysql> SELECT CHAR_LENGTH('MySQL'), CHAR_LENGTH('我是中國(guó)人');
+----------------------+---------------------------+
| CHAR_LENGTH('MySQL') | CHAR_LENGTH('我是中國(guó)人') |
+----------------------+---------------------------+
| 5 | 5 |
+----------------------+---------------------------+
CONCAT(str1,str2,...) 返回由一個(gè)或多個(gè)參數(shù)連接產(chǎn)生的字符串。
1.如果所有參數(shù)均為非二進(jìn)制字符串,則結(jié)果為非二進(jìn)制字符串。
2.如果參數(shù)包含任何二進(jìn)制字符串,則結(jié)果為二進(jìn)制字符串。
3.數(shù)字參數(shù)將轉(zhuǎn)換為其等效的非二進(jìn)制字符串形式。
4.連接的字符串中存在NULL,則返回NULL
mysql> SELECT CONCAT('My', 'S', 'QL'),CHARSET(CONCAT('My', 'S', 'QL')), CONCAT('My', 'S',NULL, 'QL'),CONCAT(X'65','f',12),CHARSET(CONCAT(X'65','f',12));
+-------------------------+----------------------------------+------------------------------+----------------------+-------------------------------+
| CONCAT('My', 'S', 'QL') | CHARSET(CONCAT('My', 'S', 'QL')) | CONCAT('My', 'S',NULL, 'QL') | CONCAT(X'65','f',12) | CHARSET(CONCAT(X'65','f',12)) |
+-------------------------+----------------------------------+------------------------------+----------------------+-------------------------------+
| MySQL | utf8mb4 | NULL | ef12 | binary |
+-------------------------+----------------------------------+------------------------------+----------------------+-------------------------------+
對(duì)于帶引號(hào)的字符串,可以通過(guò)將字符串彼此相鄰放置來(lái)實(shí)現(xiàn)串聯(lián)
mysql> SELECT 'My' 'S' 'QL' as res ;
+-------+
| res |
+-------+
| MySQL |
+-------+
CONCAT_WS(separator,str1,str2,...) 代表用分隔符連接,是CONCAT()的一種特殊形式。
1.第一個(gè)參數(shù)是分隔符, 分隔符被添加到要連接的字符串之間;
2.分隔符可以是字符串,其余參數(shù)也可以;
3.如果分隔符為NULL,則結(jié)果為NULL;
4.不會(huì)跳過(guò)空字符串, 但是,它會(huì)跳過(guò)分隔符參數(shù)之后的所有NULL值。
mysql> SELECT CONCAT_WS(',','First name','Last Name'),CONCAT_WS(NULL,'First name','Last Name'),CONCAT_WS(',','First name','','Last Name'), CONCAT_WS(',','First name',NULL,'Last Name');
+-----------------------------------------+------------------------------------------+--------------------------------------------+----------------------------------------------+
| CONCAT_WS(',','First name','Last Name') | CONCAT_WS(NULL,'First name','Last Name') | CONCAT_WS(',','First name','','Last Name') | CONCAT_WS(',','First name',NULL,'Last Name') |
+-----------------------------------------+------------------------------------------+--------------------------------------------+----------------------------------------------+
| First name,Last Name | NULL | First name,,Last Name | First name,Last Name |
+-----------------------------------------+------------------------------------------+--------------------------------------------+----------------------------------------------+
EXPORT_SET(bits,on,off[,separator[,number_of_bits]]) 這函數(shù)鄙人第一次用。Talk is cheap,show you the code ??
mysql> SELECT EXPORT_SET(111,'1對(duì)應(yīng)我','0對(duì)應(yīng)我','|',10);
+---------------------------------------------------------------------------------+
| EXPORT_SET(111,'1對(duì)應(yīng)我','0對(duì)應(yīng)我','|',10) |
+---------------------------------------------------------------------------------+
| 1對(duì)應(yīng)我|1對(duì)應(yīng)我|1對(duì)應(yīng)我|1對(duì)應(yīng)我|0對(duì)應(yīng)我|1對(duì)應(yīng)我|1對(duì)應(yīng)我|0對(duì)應(yīng)我|0對(duì)應(yīng)我|0對(duì)應(yīng)我 |
+---------------------------------------------------------------------------------+
轉(zhuǎn)換步驟:
1.將 bits 轉(zhuǎn)換為二進(jìn)制,這里是111,二進(jìn)制為 1101111 ;
2.對(duì) 1101111 從低到高位排序得到 1111011 ;
3.number_of_bits=10,表示總位數(shù)為10,不足時(shí)右側(cè)補(bǔ)0,得到 1111011000 ;
4.然后將 1 替換成 '1對(duì)應(yīng)我' ,0 替換成 '0對(duì)應(yīng)我' ,得到最終結(jié)果。
ELT(N,str1,str2,str3,...) 返回字符串列表的第N個(gè)元素:如果N = 1,則返回str1;如果N = 2,則返回str2,依此類推。 如果N小于1或大于參數(shù)個(gè)數(shù),則返回NULL。 ELT()是FIELD()函數(shù)的補(bǔ)充。
mysql> SELECT ELT(1, 'Aa', 'Bb', 'Cc', 'Dd'),ELT(3, 'Aa', 'Bb', 'Cc', 'Dd'),ELT(7, 'Aa', 'Bb', 'Cc', 'Dd') ;
+--------------------------------+--------------------------------+--------------------------------+
| ELT(1, 'Aa', 'Bb', 'Cc', 'Dd') | ELT(3, 'Aa', 'Bb', 'Cc', 'Dd') | ELT(7, 'Aa', 'Bb', 'Cc', 'Dd') |
+--------------------------------+--------------------------------+--------------------------------+
| Aa | Cc | NULL |
+--------------------------------+--------------------------------+--------------------------------+
FIELD(str,str1,str2,str3,...) 返回str在字符串 str1,str2,str3,... 中所在的位置,如找不到,則返回0。若str為NULL,則返回0。FIELD()亦是ELT()的補(bǔ)充。
mysql> SELECT FIELD('Bb', 'Aa', 'Bb', 'Cc'),FIELD('Dd', 'Aa', 'Bb', 'Cc'),FIELD(NULL, 'Aa', 'Bb', 'Cc');
+-------------------------------+-------------------------------+-------------------------------+
| FIELD('Bb', 'Aa', 'Bb', 'Cc') | FIELD('Dd', 'Aa', 'Bb', 'Cc') | FIELD(NULL, 'Aa', 'Bb', 'Cc') |
+-------------------------------+-------------------------------+-------------------------------+
| 2 | 0 | 0 |
+-------------------------------+-------------------------------+-------------------------------+
FIND_IN_SET(str,strlist) 返回str在字符串strlist中的位置。如果str是字符串,strlist是一個(gè)集合,則FIND_IN_SET()將會(huì)被優(yōu)化成位運(yùn)算。
mysql> SELECT FIND_IN_SET('b','a,b,c,d'),FIND_IN_SET('e','a,b,c,d'),FIND_IN_SET(NULL,'a,b,c,d'),FIND_IN_SET('b','a,NULL,b,c,d'),FIND_IN_SET('b,','a,b,c,d'),FIND_IN_SET('中','我,是,中,國(guó),人');
+----------------------------+----------------------------+-----------------------------+---------------------------------+-----------------------------+------------------------------------+
| FIND_IN_SET('b','a,b,c,d') | FIND_IN_SET('e','a,b,c,d') | FIND_IN_SET(NULL,'a,b,c,d') | FIND_IN_SET('b','a,NULL,b,c,d') | FIND_IN_SET('b,','a,b,c,d') | FIND_IN_SET('中','我,是,中,國(guó),人') |
+----------------------------+----------------------------+-----------------------------+---------------------------------+-----------------------------+------------------------------------+
| 2 | 0 | NULL | 3 | 0 | 3 |
+----------------------------+----------------------------+-----------------------------+---------------------------------+-----------------------------+------------------------------------+
FORMAT(X,D[,locale]) 將數(shù)字X格式化為類似于 '#,###,###.##' 的格式,四舍五入到D小數(shù)位,然后將結(jié)果作為字符串返回。 如果D為0,則結(jié)果沒(méi)有小數(shù)點(diǎn)或小數(shù)部分??蛇x的第三個(gè)參數(shù)允許指定語(yǔ)言環(huán)境,以用于結(jié)果數(shù)字的小數(shù)點(diǎn),千位分隔符以及分隔符之間的分組。 允許的語(yǔ)言環(huán)境值與lc_time_names系統(tǒng)變量的合法值相同,如果未指定語(yǔ)言環(huán)境,則默認(rèn)值為“ en_US”。
mysql> SELECT FORMAT(12332.123456, 4), FORMAT(12332.12,4), FORMAT(12332.123456, 0), FORMAT(12332.1, 2,'en_US'), FORMAT(12332.123456, 2,'de_DE');
+-------------------------+--------------------+-------------------------+----------------------------+---------------------------------+
| FORMAT(12332.123456, 4) | FORMAT(12332.12,4) | FORMAT(12332.123456, 0) | FORMAT(12332.1, 2,'en_US') | FORMAT(12332.123456, 2,'de_DE') |
+-------------------------+--------------------+-------------------------+----------------------------+---------------------------------+
| 12,332.1235 | 12,332.1200 | 12,332 | 12,332.10 | 12.332,12 |
+-------------------------+--------------------+-------------------------+----------------------------+---------------------------------+
FROM_BASE64(str) 解碼由函數(shù)TO_BASE64()編碼得到的字符串。如果str為NULL或不是有效的base-64編碼則返回NULL。
mysql> SELECT TO_BASE64('我'),FROM_BASE64(TO_BASE64('我')),FROM_BASE64(NULL);
+-----------------+------------------------------+-------------------+
| TO_BASE64('我') | FROM_BASE64(TO_BASE64('我')) | FROM_BASE64(NULL) |
+-----------------+------------------------------+-------------------+
| 5oiR | 我 | NULL |
+-----------------+------------------------------+-------------------+
TO_BASE64(str) 將字符串以base-64編碼后返回。如果參數(shù)不是字符串,則在進(jìn)行轉(zhuǎn)換之前將其轉(zhuǎn)換為字符串。解碼時(shí)用FROM_BASE64(str)。
1.The encoding for alphabet value 62 is '+'(未理解)
2.The encoding for alphabet value 63 is '/'(未理解)
3.輸入數(shù)據(jù)的每3個(gè)字節(jié)使用4個(gè)字符進(jìn)行編碼。 如果最后一組不完整,則用'='字符填充,長(zhǎng)度為4。
4.在編碼輸出的每76個(gè)字符之后添加一個(gè)換行符,以將長(zhǎng)輸出分成多行。
5.解碼識(shí)別并忽略換行符,回車符,制表符和空格。
mysql> SELECT TO_BASE64('ab'),TO_BASE64('abc'),TO_BASE64(NULL),FROM_BASE64('YW Jj') ;
+-----------------+------------------+-----------------+----------------------+
| TO_BASE64('ab') | TO_BASE64('abc') | TO_BASE64(NULL) | FROM_BASE64('YW Jj') |
+-----------------+------------------+-----------------+----------------------+
| YWI= | YWJj | NULL | abc |
+-----------------+------------------+-----------------+----------------------+
輸出超過(guò)76個(gè)字符則換行
mysql> SELECT TO_BASE64('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz');
+----------------------------------------------------------------------------------------------------------------------------------------------+
| TO_BASE64('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz') |
+----------------------------------------------------------------------------------------------------------------------------------------------+
| YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5emFiY2Rl
ZmdoaWprbG1ub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo= |
+----------------------------------------------------------------------------------------------------------------------------------------------+
HEX(str), HEX(N)返回沒(méi)有字符或數(shù)字的16進(jìn)制編碼。
mysql> SELECT HEX('我'),HEX('ab'),HEX(255),UNHEX('E68891');
+-----------+-----------+----------+-----------------+
| HEX('我') | HEX('ab') | HEX(255) | UNHEX('E68891') |
+-----------+-----------+----------+-----------------+
| E68891 | 6162 | FF | 我 |
+-----------+-----------+----------+-----------------+
UNHEX(str) 對(duì)于字符串參數(shù)str,UNHEX(str)將參數(shù)中的每對(duì)字符解釋為十六進(jìn)制數(shù)字,并將其轉(zhuǎn)換為該數(shù)字表示的字節(jié)。 返回值是一個(gè)二進(jìn)制字符串。
1.參數(shù)字符串中的字符必須為合法的十六進(jìn)制數(shù)字:“ 0” ..“ 9”,“ A” ..“ F”,“ a” ..“ f”。 如果參數(shù)包含任何非十六進(jìn)制數(shù)字,則結(jié)果為NULL;
2.如果UNHEX()的參數(shù)是BINARY列,則可能會(huì)返回NULL;
3.對(duì)于數(shù)字參數(shù)N,HEX(N)的解碼不是UNHEX(),改用CONV(HEX(N),16,10)。
mysql> SELECT UNHEX('62'),UNHEX('E68891'),HEX(255),UNHEX('FF'),CONV('FF',16,10);
+-------------+-----------------+----------+-------------+------------------+
| UNHEX('62') | UNHEX('E68891') | HEX(255) | UNHEX('FF') | CONV('FF',16,10) |
+-------------+-----------------+----------+-------------+------------------+
| b | 我 | FF | ? | 255 |
+-------------+-----------------+----------+-------------+------------------+
INSERT(str,pos,len,newstr) 返回字符串str,子字符串從pos位置開(kāi)始,并且len個(gè)字符由字符串newstr取代。
1.如果pos不在字符串的長(zhǎng)度內(nèi),則返回原始字符串。
2.如果len不在字符串其余部分的長(zhǎng)度內(nèi),則從位置pos替換字符串的其余部分。
3.如果任何參數(shù)為NULL,則返回NULL。
mysql> SELECT INSERT('who are you?', 1, 3, 'where'),INSERT('who are you?', -1, 3, 'where'),INSERT('who are you?', 1, 100, 'where'),INSERT('我是中國(guó)人', 3, 3, '渣渣輝');
+---------------------------------------+----------------------------------------+-----------------------------------------+--------------------------------------+
| INSERT('who are you?', 1, 3, 'where') | INSERT('who are you?', -1, 3, 'where') | INSERT('who are you?', 1, 100, 'where') | INSERT('我是中國(guó)人', 3, 3, '渣渣輝') |
+---------------------------------------+----------------------------------------+-----------------------------------------+--------------------------------------+
| where are you? | who are you? | where | 我是渣渣輝 |
+---------------------------------------+----------------------------------------+-----------------------------------------+--------------------------------------+
INSTR(str,substr)返回substr在str中第一次出現(xiàn)的位置,如果str或substr為NULL,則返回NULL。和兩個(gè)參數(shù)的LOCATE(substr,str)相同,只是參數(shù)順序相反。見(jiàn)下
mysql> SELECT INSTR('goodboy','boy'),INSTR('goodboy','o'),INSTR('goodboy','bye'),INSTR('goodboy',NULL);
+------------------------+----------------------+------------------------+-----------------------+
| INSTR('goodboy','boy') | INSTR('goodboy','o') | INSTR('goodboy','bye') | INSTR('goodboy',NULL) |
+------------------------+----------------------+------------------------+-----------------------+
| 5 | 2 | 0 | NULL |
+------------------------+----------------------+------------------------+-----------------------+
POSITION(substr IN str) 為L(zhǎng)OCATE(substr,str)的同義詞,見(jiàn)下
LOCATE(substr,str), LOCATE(substr,str,pos)第一個(gè)表達(dá)式返回substr在str中第一次出現(xiàn)的位置,與INSTR()一樣。第二個(gè)表達(dá)式返回從str的pos位置往后第一次出現(xiàn)substr的位置。
mysql> SELECT LOCATE('boy','goodboy'),LOCATE('o','goodboy',5),LOCATE(NULL,'goodboy');
+-------------------------+-------------------------+------------------------+
| LOCATE('boy','goodboy') | LOCATE('o','goodboy',5) | LOCATE(NULL,'goodboy') |
+-------------------------+-------------------------+------------------------+
| 5 | 6 | NULL |
+-------------------------+-------------------------+------------------------+
LCASE(str) 為函數(shù)LOWER(str)的同義詞,見(jiàn)下
LOWER(str) 根據(jù)當(dāng)前字符集,返回字符串str的小寫(xiě)形式,默認(rèn)字符集latin1。對(duì)應(yīng)將str轉(zhuǎn)為大寫(xiě)的函數(shù)UPPER(str)。
1.當(dāng)應(yīng)用于二進(jìn)制字符串(BINARY,VARBINARY,BLOB)時(shí),LOWER()和UPPER()無(wú)效。需要先將str中的數(shù)據(jù)字符集轉(zhuǎn)換為非二進(jìn)制。
2.早期版本中,視圖里的LOWER()會(huì)被改寫(xiě)成LCASE(),5.7中,LOWER()將不會(huì)被改寫(xiě)。
mysql> SELECT LOWER('Good Boy'),LOWER(BINARY 'Good Boy'),LOWER(CONVERT(BINARY 'Good Boy' using utf8));
+-------------------+--------------------------+--------------------------------------------+
| LOWER('Good Boy') | LOWER(BINARY 'Good Boy') | LOWER(CONVERT(BINARY 'Good Boy' using utf8)) |
+-------------------+--------------------------+--------------------------------------------+
| good boy | Good Boy | good boy |
+-------------------+--------------------------+--------------------------------------------+
UCASE(str)為函數(shù)UPPER(str)的同義詞,見(jiàn)下
UPPER(str) 根據(jù)當(dāng)前字符集,返回字符串str的大寫(xiě)形式,默認(rèn)字符集latin1。對(duì)應(yīng)將str轉(zhuǎn)為小寫(xiě)的函數(shù)LOWER(str)。
mysql> SELECT UPPER('Good Boy'),UPPER(BINARY 'Good Boy'),UPPER(CONVERT(BINARY 'Good Boy' using utf8));
+-------------------+--------------------------+----------------------------------------------+
| UPPER('Good Boy') | UPPER(BINARY 'Good Boy') | UPPER(CONVERT(BINARY 'Good Boy' using utf8)) |
+-------------------+--------------------------+----------------------------------------------+
| GOOD BOY | Good Boy | GOOD BOY |
+-------------------+--------------------------+----------------------------------------------+
LEFT(str,len)返回字符串str中最左邊的len個(gè)字符;如果任何參數(shù)為NULL,則返回NULL。相對(duì)應(yīng)的函數(shù)RIGHT(str,len)。見(jiàn)下
mysql> SELECT LEFT('Good Boy',4);
+------------------+
| LEFT('Good Boy',4) |
+------------------+
| Good |
+------------------+
RIGHT(str,len)返回字符串str中最右邊的len個(gè)字符;
mysql> SELECT RIGHT('Good Boy',5);
+-------------------+
| RIGHT('Good Boy',5) |
+-------------------+
| d Boy |
+-------------------+
OCTET_LENGTH(str) 為LENGTH(str)的同義詞,見(jiàn)下
LENGTH(str) 以字節(jié)為單位返回字符串str的長(zhǎng)度。 多字節(jié)字符計(jì)為多個(gè)字節(jié)。 這意味著對(duì)于包含5個(gè)2字節(jié)字符的字符串,LENGTH()返回10,而CHAR_LENGTH()返回5。
mysql> SELECT LENGTH('text'),CHARSET('左輪'),LENGTH('左輪');
+----------------+-------------------+------------------+
| LENGTH('text') | CHARSET('左輪') | LENGTH('左輪') |
+----------------+-------------------+------------------+
| 4 | utf8 | 6 |
+----------------+-------------------+------------------+
LOAD_FILE(file_name) 讀取文件內(nèi)容并以字符串形式返回。
1.用戶需要有file權(quán)限;
2.文件不要超過(guò) max_allowed_packet大??;
3.參數(shù)secure_file_priv需要為非NULL,且指定到一個(gè)目錄路徑;
4.如果文件不可讀或者不存在,則返回NULL。
mysql> SELECT LOAD_FILE('D:\\A.TXT'),LOAD_FILE('D:\\B.TXT');
+------------------------+------------------------+
| LOAD_FILE('D:\\A.TXT') | LOAD_FILE('D:\\B.TXT') |
+------------------------+------------------------+
| HAHAHAA | NULL |
+------------------------+------------------------+
可以用文件里的數(shù)據(jù)更新表中的字段。
mysql> UPDATE T SET T_NAME=LOAD_FILE('D:\\A.TXT') WHERE T_ID = '01';
LPAD(str,len,padstr) 返回字符串str
1.如果len > str 的長(zhǎng)度,則用padstr左填充str至len長(zhǎng)度;
2.如果len < str 的長(zhǎng)度,則返回len長(zhǎng)度的字符;
3.相對(duì)應(yīng)函數(shù)RPAD(str)。
mysql> SELECT LPAD('GoodBoy',12,'$'),LPAD('GoodBoy',4,'$');
+------------------------+-----------------------+
| LPAD('GoodBoy',12,'$') | LPAD('GoodBoy',4,'$') |
+------------------------+-----------------------+
| $$$$$GoodBoy | Good |
+------------------------+-----------------------+
RPAD(str,len,padstr) 返回字符串str,用法同LPAD(str,len,padstr)
mysql> SELECT RPAD('GoodBoy',12,'$'),RPAD('GoodBoy',4,'$');
+------------------------+-----------------------+
| RPAD('GoodBoy',12,'$') | RPAD('GoodBoy',4,'$') |
+------------------------+-----------------------+
| GoodBoy$$$$$ | Good |
+------------------------+-----------------------+
LTRIM(str)返回已刪除str前面空格后的字符串
RTRIM(str) 返回已刪除str后面空格后的字符串
TRIM(str)返回已刪除str前面及后面空格后的字符串
mysql> SELECT LTRIM(' GoodBoy ') LTR,length(LTRIM(' GoodBoy ')) Len_LTR,RTRIM(' GoodBoy ') RTR,length(RTRIM(' GoodBoy ')) Len_RTR,TRIM(' GoodBoy ') TR,length(TRIM(' GoodBoy ')) Len_TR ;
+-----------+----------+-----------+----------+----------+---------+
| LTR | Len_LTR | RTR | Len_RTR | TR | Len_TR |
+-----------+----------+-----------+----------+----------+---------+
| GoodBoy | 9 | GoodBoy | 9 | GoodBoy | 7 |
+-----------+----------+-----------+----------+----------+---------+
MAKE_SET(bits,str1,str2,...) Talk is cheap,show you the code ??
mysql> SELECT MAKE_SET(18,'a','b','c','d','e','f');
+---------------------------+
| MAKE_SET(18,'a','b','c','d','e','f') |
+---------------------------+
| b,e |
+---------------------------+
轉(zhuǎn)換步驟:
1.首先 'a','b','c','d','e','f' 分別對(duì)應(yīng) 2^0,2^1,2^2 ... ,即1,2,4,8,16...,是從低位到高位的順序。
2.18 = 2 + 16,對(duì)應(yīng) 'b' 和 'e',返回即可。
3.或者可以這么理解,將18轉(zhuǎn)為2進(jìn)制,得到 10010 ,從低位到高位則為 01001(顛倒下順序即可),對(duì)應(yīng)到'a','b','c','d','e','f'上。
'a' 'b' 'c' 'd' 'e' 'f'
0 1 0 0 1 0
即'b' 'e'。
mysql> SELECT MAKE_SET(18|6,'a','b','c','d','e','f');
+-----------------------------+
| MAKE_SET(18|6,'a','b','c','d','e','f') |
+-----------------------------+
| b,c,e |
+-----------------------------+
轉(zhuǎn)換步驟:
此處只是將 18|6 進(jìn)行了位或 運(yùn)算
1 0 0 1 0
0 0 1 1 0
---------
1 0 1 1 0
結(jié)果 1 0 1 1 0 ,從低位到高位則為 01101(顛倒下順序即可),對(duì)應(yīng)到'a','b','c','d','e','f'上。
'a' 'b' 'c' 'd' 'e' 'f'
0 1 1 0 1 0
即 b c e
MATCH()完整表達(dá)式 MATCH (col1,col2,...) AGAINST (expr [search_modifier]),全文索引字符搜索,詳細(xì)介紹見(jiàn)官檔:https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html
mysql> CREATE TABLE articles (
-> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> title VARCHAR(200),
-> body TEXT,
-> FULLTEXT (title,body)
-> ) ENGINE=InnoDB;
mysql> INSERT INTO articles (title,body) VALUES
-> ('MySQL Tutorial','This database tutorial ...'),
-> ("How To Use MySQL",'After you went through a ...'),
-> ('Optimizing Your Database','In this database tutorial ...'),
-> ('MySQL vs. YourSQL','When comparing databases ...'),
-> ('MySQL Security','When configured properly, MySQL ...'),
-> ('Database, Database, Database','database database database'),
-> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
-> ('MySQL Full-Text Indexes', 'MySQL fulltext indexes use a ..');
mysql> SELECT * FROM articles
-> WHERE MATCH (title,body)
-> AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----+------------------------------+-------------------------------+
| id | title | body |
+----+------------------------------+-------------------------------+
| 6 | Database, Database, Database | database database database |
| 3 | Optimizing Your Database | In this database tutorial ... |
| 1 | MySQL Tutorial | This database tutorial ... |
+----+------------------------------+-------------------------------+
MID(str,pos,len)為SUBSTRING(str,pos,len)的同義詞。見(jiàn)下
SUBSTR(str,pos,len)為SUBSTRING(str,pos,len)的同義詞。見(jiàn)下
SUBSTRING(str,pos), SUBSTRING(str FROM pos)
SUBSTRING(str,pos,len), SUBSTRING(str FROM pos FOR len)
1.SUBSTRING()有以上幾種形式;
2.FROM pos 的寫(xiě)法是標(biāo)準(zhǔn)SQL語(yǔ)法;
3.pos也可以是負(fù)值,即從尾往前定位pos。
4.pos為0或len小于1,則返回空字符串。
mysql> SELECT SUBSTRING('Quadratically',5),SUBSTRING('Quadratically' FROM 5),SUBSTRING('Quadratically',5,3),SUBSTRING('Quadratically',-5),SUBSTRING('Quadratically',-5,4);
+------------------------------+-----------------------------------+--------------------------------+-------------------------------+---------------------------------+
| SUBSTRING('Quadratically',5) | SUBSTRING('Quadratically' FROM 5) | SUBSTRING('Quadratically',5,3) | SUBSTRING('Quadratically',-5) | SUBSTRING('Quadratically',-5,4) |
+------------------------------+-----------------------------------+--------------------------------+-------------------------------+---------------------------------+
| ratically | ratically | rat | cally | call |
+------------------------------+-----------------------------------+--------------------------------+-------------------------------+---------------------------------+
OCT(N) 返回N的八進(jìn)制值的字符串表示形式,其中N是一個(gè)longlong(BIGINT)數(shù)字。 這等效于CONV(N,10,8)。 如果N為NULL,則返回NULL。
mysql> SELECT OCT(8),CONV(8,10,8),OCT(null);
+--------+--------------+----------+
| OCT(8) | CONV(8,10,8) | OCT(null) |
+--------+--------------+----------+
| 10 | 10 | NULL |
+--------+--------------+----------+
QUOTE(str)引用字符串以產(chǎn)生可在SQL語(yǔ)句中用作正確轉(zhuǎn)義的數(shù)據(jù)值的結(jié)果。
mysql> SELECT QUOTE('Don\'t!'),QUOTE(NULL),QUOTE('Don\t!');
+---------------+--------------+---------------+
| QUOTE('Don\'t!') | QUOTE(NULL) | QUOTE('Don\t!') |
+---------------+--------------+---------------+
| 'Don\'t!' | NULL | 'Don !' |
+---------------+--------------+---------------+
REPEAT(str,count) 返回一個(gè)由重復(fù)計(jì)數(shù)次數(shù)count的字符串str組成的字符串。 如果count小于1,則返回一個(gè)空字符串。 如果str或count為NULL,則返回NULL。
mysql> SELECT REPEAT('MySQL', 3),REPEAT('MySQL', -1),REPEAT('MySQL', NULL);
+--------------------+---------------------+-----------------------+
| REPEAT('MySQL', 3) | REPEAT('MySQL', -1) | REPEAT('MySQL', NULL) |
+--------------------+---------------------+-----------------------+
| MySQLMySQLMySQL | | NULL |
+--------------------+---------------------+-----------------------+
REPLACE(str,from_str,to_str) 返回字符串str,其中所有出現(xiàn)的字符串from_str都替換為字符串to_str。REPLACE()執(zhí)行區(qū)分大小寫(xiě)的匹配。
mysql> SELECT REPLACE('www.mysql.com', 'w', 'Qq'),REPLACE('www.mysql.com', 'W', 'Qq'),REPLACE('www.mysql.com', 'w',NULL);
+-------------------------------------+-------------------------------------+------------------------------------+
| REPLACE('www.mysql.com', 'w', 'Qq') | REPLACE('www.mysql.com', 'W', 'Qq') | REPLACE('www.mysql.com', 'w',NULL) |
+-------------------------------------+-------------------------------------+------------------------------------+
| QqQqQq.mysql.com | www.mysql.com | NULL |
+-------------------------------------+-------------------------------------+------------------------------------+
REVERSE(str) 返回str反轉(zhuǎn)后的字符串。
mysql> SELECT REVERSE('GoodBoy');
+--------------------+
| REVERSE('GoodBoy') |
+--------------------+
| yoBdooG |
+--------------------+
SOUNDEX(str)從str返回一個(gè)soundex字符串。
1.發(fā)音聽(tīng)起來(lái)幾乎相同的兩個(gè)單詞應(yīng)該具有相同的soundex字符串。
2.標(biāo)準(zhǔn)soundex字符串長(zhǎng)四個(gè)字符,但SOUNDEX()函數(shù)返回任意長(zhǎng)的字符串。
3.str中的所有非字母字符都將被忽略。
4.所有A-Z范圍以外的國(guó)際字母字符都被視為元音。
5.此函數(shù)轉(zhuǎn)換時(shí)是先丟棄元音,然后再去掉重復(fù)字符,屬于原始的Soundex算法。增強(qiáng)版本是先去掉重復(fù)字符,然后再丟棄元音。
6.函數(shù)作用:在做搜尋引擎時(shí)面對(duì)用戶傳入的英文字符串,可用本函數(shù)做類似模糊比對(duì)的效果。
mysql> SELECT SOUNDEX('ladygaga');
+---------------------+
| SOUNDEX('ladygaga') |
+---------------------+
| L320 |
+---------------------+
各字符對(duì)應(yīng)數(shù)字的轉(zhuǎn)換規(guī)則:
'AEHIOUWY' : 0
'BFPV' : 1
'CGJKQSXZ' : 2
'DT' : 3
'L' : 4
'MN' : 5
'R' : 6
轉(zhuǎn)換步驟:
1.先將對(duì)應(yīng)0的元音字符去掉,得到 'ldgg';
2.去掉重復(fù)字符,得到 'ldg';
3.首字符不變,其他字符轉(zhuǎn)換為對(duì)應(yīng)數(shù)字,得到 'l32';
4.長(zhǎng)度不夠4位,后面補(bǔ)0,得到 'l320';
5.首字符大寫(xiě),得到最終結(jié)果 L320 。
發(fā)音相同的單詞具有相同的soundex字符串。
mysql> select soundex('Hunt'),soundex('Hant');
+-----------------+-----------------+
| soundex('Hunt') | soundex('Hant') |
+-----------------+-----------------+
| H530 | H530 |
+-----------------+-----------------+
expr1 SOUNDS LIKE expr2 比較expr1的soundex字符串是否等于expr2的soundex字符串,返回布爾值。相同返回1,不同返回0。和表達(dá)式 SOUNDEX(str1) = SOUNDEX(str2) 效果一致。
mysql> SELECT 'Hunt' SOUNDS LIKE 'Hant',SOUNDEX('HUNT') = SOUNDEX('HANT'),'GOOD' SOUNDS LIKE 'BOY' ;
+---------------------------+-----------------------------------+--------------------------+
| 'Hunt' SOUNDS LIKE 'Hant' | SOUNDEX('HUNT') = SOUNDEX('HANT') | 'GOOD' SOUNDS LIKE 'BOY' |
+---------------------------+-----------------------------------+--------------------------+
| 1 | 1 | 0 |
+---------------------------+-----------------------------------+--------------------------+
SPACE(N)返回由N個(gè)空格字符組成的字符串。
mysql> SELECT CONCAT('A',SPACE(6),'B');
+--------------------------+
| CONCAT('A',SPACE(6),'B') |
+--------------------------+
| A B |
+--------------------------+
SUBSTRING_INDEX(str,delim,count) 在出現(xiàn)定界符delim之前,從字符串str返回子字符串。
1.如果count為正,則返回最后定界符左側(cè)的所有內(nèi)容(從左側(cè)開(kāi)始計(jì)數(shù))。
2.如果count為負(fù),則返回最后定界符右邊的所有內(nèi)容(從右邊開(kāi)始計(jì)數(shù))。
3.搜索delim時(shí),SUBSTRING_INDEX()執(zhí)行區(qū)分大小寫(xiě)。
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2),SUBSTRING_INDEX('www.mysql.com', '.', 6),SUBSTRING_INDEX('www.mysql.com', '.', -2);
+------------------------------------------+------------------------------------------+-------------------------------------------+
| SUBSTRING_INDEX('www.mysql.com', '.', 2) | SUBSTRING_INDEX('www.mysql.com', '.', 6) | SUBSTRING_INDEX('www.mysql.com', '.', -2) |
+------------------------------------------+------------------------------------------+-------------------------------------------+
| www.mysql | www.mysql.com | mysql.com |
+------------------------------------------+------------------------------------------+-------------------------------------------+
WEIGHT_STRING()完整表達(dá)式WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [LEVEL levels] [flags])
WEIGHT_STRING()是供內(nèi)部使用的調(diào)試函數(shù)。 不做描述。
二、字符串比較函數(shù)
LIKE() 完整表達(dá)式expr LIKE pat [ESCAPE 'escape_char']
1.使用SQL模式進(jìn)行匹配。 返回布爾值,匹配到則為1(TRUE),否則為0(FALSE);如果expr或pat為NULL,則結(jié)果為NULL;
mysql> select 'good' like 'good','good' like 'god','good' like NULL;
+--------------------+-------------------+------------------+
| 'good' like 'good' | 'good' like 'god' | 'good' like NULL |
+--------------------+-------------------+------------------+
| 1 | 0 | NULL |
+--------------------+-------------------+------------------+
2.默認(rèn)不區(qū)分大小寫(xiě)匹配,如果字符串比較中的任何表達(dá)式區(qū)分大小寫(xiě),則以區(qū)分大小寫(xiě)的方式執(zhí)行比較;
SELECT 'abc' LIKE 'ABC','abc' LIKE BINARY 'ABC','abc' LIKE _latin1 'ABC' COLLATE latin1_general_cs;
+------------------+-------------------------+----------------------------------------------------+
| 'abc' LIKE 'ABC' | 'abc' LIKE BINARY 'ABC' | 'abc' LIKE _latin1 'ABC' COLLATE latin1_general_cs |
+------------------+-------------------------+----------------------------------------------------+
| 1 | 0 | 0 |
+------------------+-------------------------+----------------------------------------------------+
3.LIKE在每個(gè)字符的基礎(chǔ)上執(zhí)行匹配,因此它可以產(chǎn)生與=比較運(yùn)算符不同的結(jié)果;
SELECT '?' LIKE 'ae' COLLATE utf8mb4_german2_ci,'?' = 'ae' COLLATE utf8mb4_german2_ci;
+------------------------------------------+---------------------------------------+
| '?' LIKE 'ae' COLLATE utf8mb4_german2_ci | '?' = 'ae' COLLATE utf8mb4_german2_ci |
+------------------------------------------+---------------------------------------+
| 0 | 1 |
+------------------------------------------+---------------------------------------+
4.對(duì)于非二進(jìn)制字符串,末尾空格需要參與到比較中。
MySQL8版本中則取決于排序集collations的PAD屬性,有以下兩個(gè)值:
> PAD SPACE 比較字符串時(shí)不考慮尾隨空格
> NO PAD 比較字符串時(shí)考慮尾隨空格
mysql> SELECT 'a' = 'a ', 'a' LIKE 'a ';
+------------+---------------+
| 'a' = 'a ' | 'a' LIKE 'a ' |
+------------+---------------+
| 1 | 0 |
+------------+---------------+
5.通配符
% 匹配任意數(shù)量的字符,甚至零個(gè)字符
_ 精確匹配一個(gè)字符
mysql> SELECT 'David!' LIKE '%D%v%','David!' LIKE 'David_','David!!' LIKE 'David_';
+-----------------------+------------------------+-------------------------+
| 'David!' LIKE '%D%v%' | 'David!' LIKE 'David_' | 'David!!' LIKE 'David_' |
+-----------------------+------------------------+-------------------------+
| 1 | 1 | 0 |
+-----------------------+------------------------+-------------------------+
6.要測(cè)試通配符的文字實(shí)例,請(qǐng)?jiān)谄淝懊婕由限D(zhuǎn)義符。 如果未指定ESCAPE字符,則假定\。
% 匹配一個(gè)%字符
_ 匹配一個(gè)_字符
mysql> SELECT 'David%' LIKE 'David\%','David_' LIKE 'David\_';
+-------------------------+-------------------------+
| 'David%' LIKE 'David\%' | 'David_' LIKE 'David\_' |
+-------------------------+-------------------------+
| 1 | 1 |
+-------------------------+-------------------------+
7.要指定其他轉(zhuǎn)義字符,請(qǐng)使用ESCAPE子句
mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|';
+------------------------------------+
| 'David_' LIKE 'David|_' ESCAPE '|' |
+------------------------------------+
| 1 |
+------------------------------------+
8.作為對(duì)標(biāo)準(zhǔn)SQL的擴(kuò)展,MySQL允許對(duì)數(shù)字表達(dá)式使用LIKE。
mysql> SELECT 10 LIKE '1%';
+--------------+
| 10 LIKE '1%' |
+--------------+
| 1 |
+--------------+
NOT LIKE() 完整表達(dá)式expr NOT LIKE pat [ESCAPE 'escape_char']
與NOT(expr LIKE pat [ESCAPE'escape_char'])相同,可參考LIKE用法。
注意字段包含NULL的情況,日常工作中也會(huì)經(jīng)常遇到。
like 的數(shù)據(jù)量 + not like 的數(shù)據(jù)量 <> 總量,就是因?yàn)樽侄未嬖贜ULL導(dǎo)致。
有表數(shù)據(jù)如下:
mysql> select * From foo ;
+------+
| bar |
+------+
| NULL |
| NULL |
+------+
mysql> select count(*) from foo where bar like '%ba%';
+----------+
| count(*) |
+----------+
| 0 |
+----------+
mysql> select count(*) from foo where bar not like '%ba%';
+----------+
| count(*) |
+----------+
| 0 |
+----------+
mysql> select count(*) from foo where bar not like '%ba%' or bar is null;
+----------+
| count(*) |
+----------+
| 2 |
+----------+
STRCMP(expr1,expr2)如果字符串相同,則STRCMP()返回0;根據(jù)當(dāng)前排序順序,如果第一個(gè)參數(shù)小于第二個(gè)參數(shù),則返回-1,否則返回1。
mysql> SELECT STRCMP('text', 'text'),STRCMP('text1', 'text2'),STRCMP('text2', 'text1');
+------------------------+--------------------------+--------------------------+
| STRCMP('text', 'text') | STRCMP('text1', 'text2') | STRCMP('text2', 'text1') |
+------------------------+--------------------------+--------------------------+
| 0 | -1 | 1 |
+------------------------+--------------------------+--------------------------+
指定排序規(guī)則的字符串進(jìn)行比較
mysql> SELECT STRCMP(_latin1 'A' COLLATE latin1_general_ci,_latin1 'a' COLLATE latin1_general_ci),STRCMP(_latin1 'A' COLLATE latin1_general_cs,_latin1 'a' COLLATE latin1_general_cs);
+-------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| STRCMP(_latin1 'A' COLLATE latin1_general_ci,_latin1 'a' COLLATE latin1_general_ci) | STRCMP(_latin1 'A' COLLATE latin1_general_cs,_latin1 'a' COLLATE latin1_general_cs) |
+-------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| 0 | -1 |
+-------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
三、正則表達(dá)式
見(jiàn)鏈接 http://www.itdecent.cn/p/cc18fd228e88
四、字符集和排序規(guī)則函數(shù)
1.簡(jiǎn)單字符串函數(shù)返回的值的字符集與輸入字符串的字符集相同;如 INSTR(), LCASE(), LOWER(), LTRIM(), MID(), REPEAT(), REPLACE(), REVERSE(), RIGHT(), RPAD(), RTRIM(), SOUNDEX(), SUBSTRING(), TRIM(), UCASE(), and UPPER()等。
2.與所有其他函數(shù)不同,REPLACE()函數(shù)始終忽略字符串輸入的排序規(guī)則,并執(zhí)行區(qū)分大小寫(xiě)的比較。
3.對(duì)于多個(gè)輸入字符串(多個(gè)字符集),一個(gè)輸出字符串的情形,滿足以下規(guī)則:
> 如果明確COLLATE 為Y,則返回COLLATE 為Y;
> 如果明確COLLATE 為Y 和 Z,則拋出錯(cuò)誤;
> 否則,如果所有COLLATE 為Y,則返回COLLATE 為Y;
> 否則,返回的結(jié)果集沒(méi)有COLLATE。
例如,使用CASE ... WHEN a THEN b WHEN b THEN c COLLATE X END,所得的排序規(guī)則為X。同樣適用于UNION,||,CONCAT(),ELT(),GREATEST(),IF() 和LEAST()。
4.對(duì)于轉(zhuǎn)換為字符數(shù)據(jù)的操作,這些操作產(chǎn)生的字符串的字符集和排序規(guī)則由character_set_connection和collat??ion_connection系統(tǒng)變量定義,這些系統(tǒng)變量確定默認(rèn)的連接字符集和排序規(guī)則。 僅適用于CAST(),CONV(),F(xiàn)ORMAT(),HEX()和SPACE()。
5.從MySQL 5.7.19開(kāi)始,虛擬生成的列的表達(dá)式是以上規(guī)則的例外情況。 在這樣的表達(dá)式中,表默認(rèn)的字符集用于CONV()或HEX()的結(jié)果,而與連接字符集(character_set_connection和collat??ion_connection)無(wú)關(guān)。
5.使用CHARSET()或collation()函數(shù)查找所屬字符集。
mysql> SELECT CHARSET('a'),CHARSET(BINARY 'a'),CHARSET(COMPRESS('abc')), COLLATION(COMPRESS('abc'));
+--------------+---------------------+--------------------------+----------------------------+
| CHARSET('a') | CHARSET(BINARY 'a') | CHARSET(COMPRESS('abc')) | COLLATION(COMPRESS('abc')) |
+--------------+---------------------+--------------------------+----------------------------+
| utf8mb4 | binary | binary | binary |
+--------------+---------------------+--------------------------+----------------------------+