表 14.12 字串函數和運算子
名稱 | 描述 |
---|---|
ASCII() |
傳回最左側字元的數值 |
BIN() |
傳回包含數字二進位表示的字串 |
BIT_LENGTH() |
傳回引數的位元長度 |
CHAR() |
傳回每個傳遞整數的字元 |
CHAR_LENGTH() |
傳回引數中的字元數 |
CHARACTER_LENGTH() |
CHAR_LENGTH() 的同義字 |
CONCAT() |
傳回串連字串 |
CONCAT_WS() |
傳回以分隔符號串連的字串 |
ELT() |
傳回索引編號的字串 |
EXPORT_SET() |
傳回一個字串,使得對於值位元中設定的每個位元,您會獲得一個 on 字串,而對於每個未設定的位元,您會獲得一個 off 字串 |
FIELD() |
第一個引數在後續引數中的索引 (位置) |
FIND_IN_SET() |
第一個引數在第二個引數中的索引 (位置) |
FORMAT() |
傳回格式化為指定小數位數的數字 |
HEX() |
十進位或字串值的十六進位表示法 |
INSERT() |
在指定位置插入子字串,直到指定字元數 |
INSTR() |
傳回子字串第一次出現的索引 |
LCASE() |
LOWER() 的同義字 |
LEFT() |
傳回指定的最左側字元數 |
LENGTH() |
傳回字串的位元組長度 |
LIKE |
簡單模式比對 |
LOAD_FILE() |
載入具名檔案 |
LOCATE() |
傳回子字串第一次出現的位置 |
LOWER() |
傳回小寫引數 |
LPAD() |
傳回字串引數,以指定的字串在左側填補 |
LTRIM() |
移除前置空格 |
MAKE_SET() |
傳回一組以逗號分隔的字串,這些字串在位元中具有對應的設定位元 |
MATCH() |
執行全文檢索 |
MID() |
傳回從指定位置開始的子字串 |
NOT LIKE |
簡單模式比對的否定 |
NOT REGEXP |
REGEXP 的否定 |
OCT() |
傳回包含數字八進位表示法的字串 |
OCTET_LENGTH() |
LENGTH() 的同義字 |
ORD() |
傳回引數最左側字元的字元代碼 |
POSITION() |
LOCATE() 的同義字 |
QUOTE() |
逸出引數以用於 SQL 陳述式 |
REGEXP |
字串是否與正規表示式相符 |
REGEXP_INSTR() |
與正規表示式相符的子字串的起始索引 |
REGEXP_LIKE() |
字串是否與正規表示式相符 |
REGEXP_REPLACE() |
取代與正規表示式相符的子字串 |
REGEXP_SUBSTR() |
傳回與正規表示式相符的子字串 |
REPEAT() |
重複指定次數的字串 |
REPLACE() |
取代指定字串的出現次數 |
REVERSE() |
反轉字串中的字元 |
RIGHT() |
傳回指定的最右側字元數 |
RLIKE |
字串是否與正規表示式相符 |
RPAD() |
附加字串指定的次數 |
RTRIM() |
移除尾隨空格 |
SOUNDEX() |
傳回 soundex 字串 |
SOUNDS LIKE |
比較發音 |
SPACE() |
傳回指定數量的空格字串 |
STRCMP() |
比較兩個字串 |
SUBSTR() |
傳回指定的子字串 |
SUBSTRING() |
傳回指定的子字串 |
SUBSTRING_INDEX() |
從字串中傳回指定分隔符號出現次數之前的子字串 |
TRIM() |
移除前置和尾隨空格 |
UCASE() |
UPPER() 的同義字 |
UNHEX() |
傳回包含數字十六進位表示法的字串 |
UPPER() |
轉換為大寫 |
WEIGHT_STRING() |
傳回字串的權重字串 |
如果結果的長度大於系統變數 max_allowed_packet
的值,則傳回字串值的函數會傳回 NULL
。請參閱第 7.1.1 節,「設定伺服器」。
對於處理字串位置的函數,第一個位置編號為 1。
對於採用長度引數的函數,非整數引數會四捨五入到最接近的整數。
傳回字串
str
最左側字元的數值。如果str
是空字串,則傳回0
。如果str
是NULL
,則傳回NULL
。ASCII()
適用於 8 位元字元。mysql> SELECT ASCII('2'); -> 50 mysql> SELECT ASCII(2); -> 50 mysql> SELECT ASCII('dx'); -> 100
另請參閱
ORD()
函數。傳回
N
的二進位值字串表示法,其中N
是一個 longlong (BIGINT
) 數字。這等同於CONV(
。如果N
,10,2)N
為NULL
,則傳回NULL
。mysql> SELECT BIN(12); -> '1100'
傳回字串
str
的位元長度。如果str
為NULL
,則傳回NULL
。mysql> SELECT BIT_LENGTH('text'); -> 32
CHAR(
N
,... [USINGcharset_name
])CHAR()
將每個引數N
解譯為整數,並傳回一個字串,該字串由這些整數的程式碼值所代表的字元組成。會跳過NULL
值。mysql> SELECT CHAR(77,121,83,81,'76'); +--------------------------------------------------+ | CHAR(77,121,83,81,'76') | +--------------------------------------------------+ | 0x4D7953514C | +--------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CHAR(77,77.3,'77.3'); +--------------------------------------------+ | CHAR(77,77.3,'77.3') | +--------------------------------------------+ | 0x4D4D4D | +--------------------------------------------+ 1 row in set (0.00 sec)
預設情況下,
CHAR()
會傳回二進位字串。若要產生特定字元集中的字串,請使用選用的USING
子句。mysql> SELECT CHAR(77,121,83,81,'76' USING utf8mb4); +---------------------------------------+ | CHAR(77,121,83,81,'76' USING utf8mb4) | +---------------------------------------+ | MySQL | +---------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CHAR(77,77.3,'77.3' USING utf8mb4); +------------------------------------+ | CHAR(77,77.3,'77.3' USING utf8mb4) | +------------------------------------+ | MMM | +------------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS; +---------+------+-------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: '77.3' | +---------+------+-------------------------------------------+ 1 row in set (0.00 sec)
如果指定
USING
,且結果字串對於給定的字元集無效,則會發出警告。此外,如果啟用嚴格 SQL 模式,則CHAR()
的結果會變成NULL
。如果從 mysql 用戶端內叫用
CHAR()
,則會使用十六進位表示法顯示二進位字串,具體取決於--binary-as-hex
的值。如需有關該選項的詳細資訊,請參閱第 6.5.1 節,「mysql — MySQL 命令列用戶端」。CHAR()
大於 255 的引數會轉換為多個結果位元組。例如,CHAR(256)
等同於CHAR(1,0)
,而CHAR(256*256)
等同於CHAR(1,0,0)
mysql> SELECT HEX(CHAR(1,0)), HEX(CHAR(256)); +----------------+----------------+ | HEX(CHAR(1,0)) | HEX(CHAR(256)) | +----------------+----------------+ | 0100 | 0100 | +----------------+----------------+ 1 row in set (0.00 sec) mysql> SELECT HEX(CHAR(1,0,0)), HEX(CHAR(256*256)); +------------------+--------------------+ | HEX(CHAR(1,0,0)) | HEX(CHAR(256*256)) | +------------------+--------------------+ | 010000 | 010000 | +------------------+--------------------+ 1 row in set (0.00 sec)
傳回字串
str
的長度,以程式碼點為單位。多位元組字元計為單一程式碼點。這表示,對於包含兩個 3 位元組字元的字串,LENGTH()
會傳回6
,而CHAR_LENGTH()
會傳回2
,如下所示mysql> SET @dolphin:='海豚'; Query OK, 0 rows affected (0.01 sec) mysql> SELECT LENGTH(@dolphin), CHAR_LENGTH(@dolphin); +------------------+-----------------------+ | LENGTH(@dolphin) | CHAR_LENGTH(@dolphin) | +------------------+-----------------------+ | 6 | 2 | +------------------+-----------------------+ 1 row in set (0.00 sec)
如果
str
為NULL
,CHAR_LENGTH()
會傳回NULL
。CHARACTER_LENGTH()
是CHAR_LENGTH()
的同義詞。傳回由引數串連而成的字串。可以有一個或多個引數。如果所有引數都是非二進位字串,則結果會是非二進位字串。如果引數包含任何二進位字串,則結果會是二進位字串。數值引數會轉換為其等效的非二進位字串格式。
如果任何引數為
NULL
,則CONCAT()
會傳回NULL
。mysql> SELECT CONCAT('My', 'S', 'QL'); -> 'MySQL' mysql> SELECT CONCAT('My', NULL, 'QL'); -> NULL mysql> SELECT CONCAT(14.3); -> '14.3'
對於帶引號的字串,可以將字串彼此相鄰放置來執行串連
mysql> SELECT 'My' 'S' 'QL'; -> 'MySQL'
如果從 mysql 用戶端內叫用
CONCAT()
,則會使用十六進位表示法顯示二進位字串結果,具體取決於--binary-as-hex
的值。如需有關該選項的詳細資訊,請參閱第 6.5.1 節,「mysql — MySQL 命令列用戶端」。CONCAT_WS(
separator
,str1
,str2
,...)CONCAT_WS()
代表 Concatenate With Separator,它是CONCAT()
的特殊形式。第一個引數是其餘引數的分隔符號。分隔符號會加入到要串連的字串之間。分隔符號可以是字串,其餘引數也可以是字串。如果分隔符號為NULL
,則結果為NULL
。mysql> SELECT CONCAT_WS(',', 'First name', 'Second name', 'Last Name'); -> 'First name,Second name,Last Name' mysql> SELECT CONCAT_WS(',', 'First name', NULL, 'Last Name'); -> 'First name,Last Name'
CONCAT_WS()
不會跳過空字串。不過,它會跳過分隔符號引數之後的任何NULL
值。ELT()
會傳回字串清單的第N
個元素:如果N
=1
,則為str1
,如果N
=2
,則為str2
,依此類推。如果N
小於1
、大於引數數量或為NULL
,則傳回NULL
。ELT()
是FIELD()
的補充。mysql> SELECT ELT(1, 'Aa', 'Bb', 'Cc', 'Dd'); -> 'Aa' mysql> SELECT ELT(4, 'Aa', 'Bb', 'Cc', 'Dd'); -> 'Dd'
EXPORT_SET(
bits
,on
,off
[,separator
[,number_of_bits
]])傳回一個字串,使得對於值
bits
中設定的每個位元,您會取得on
字串,而對於值中未設定的每個位元,您會取得off
字串。bits
中的位元會從右到左 (從低位到高位) 進行檢查。字串會從左到右加入結果中,並以separator
字串 (預設值為逗號字元,
) 分隔。檢查的位元數由number_of_bits
給定,如果未指定,則預設值為 64。number_of_bits
如果大於 64,則會以無訊息方式剪裁為 64。它會被視為不帶正負號的整數,因此值 -1 實際上與 64 相同。mysql> SELECT EXPORT_SET(5,'Y','N',',',4); -> 'Y,N,Y,N' mysql> SELECT EXPORT_SET(6,'1','0',',',10); -> '0,1,1,0,0,0,0,0,0,0'
傳回
str
在str1
、str2
、str3
、...
清單中的索引 (位置)。如果找不到str
,則傳回0
。如果
FIELD()
的所有引數都是字串,則會將所有引數視為字串進行比較。如果所有引數都是數字,則會將它們視為數字進行比較。否則,會將引數視為 double 進行比較。如果
str
為NULL
,則傳回值為0
,因為NULL
無法與任何值進行相等比較。FIELD()
是ELT()
的補充。mysql> SELECT FIELD('Bb', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff'); -> 2 mysql> SELECT FIELD('Gg', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff'); -> 0
如果字串
str
在由N
個子字串組成的字串清單strlist
中,則傳回 1 到N
範圍內的值。字串清單是由以,
字元分隔的子字串組成的字串。如果第一個引數是常數字串,而第二個引數是SET
類型的資料行,則會最佳化FIND_IN_SET()
函式以使用位元算術。如果str
不在strlist
中,或者如果strlist
是空字串,則傳回0
。如果任一引數為NULL
,則傳回NULL
。如果第一個引數包含逗號 (,
) 字元,則此函式無法正常運作。mysql> SELECT FIND_IN_SET('b','a,b,c,d'); -> 2
將數字
X
格式化為類似'#,###,###.##'
的格式,四捨五入到D
個小數位數,並將結果傳回為字串。如果D
為0
,則結果沒有小數點或小數部分。如果X
或D
為NULL
,則函式會傳回NULL
。選用的第三個參數允許指定要用於結果數字的小數點、千位分隔符號以及分隔符號之間的分組的地區設定。允許的地區設定值與
lc_time_names
系統變數的合法值相同 (請參閱第 12.16 節,「MySQL 伺服器地區設定支援」)。如果地區設定為NULL
或未指定,則預設地區設定為'en_US'
。mysql> SELECT FORMAT(12332.123456, 4); -> '12,332.1235' mysql> SELECT FORMAT(12332.1,4); -> '12,332.1000' mysql> SELECT FORMAT(12332.2,0); -> '12,332' mysql> SELECT FORMAT(12332.2,2,'de_DE'); -> '12.332,20'
接受使用
TO_BASE64()
使用的 base-64 編碼規則編碼的字串,並傳回已解碼的結果作為二進位字串。如果引數為NULL
或不是有效的 base-64 字串,則結果為NULL
。如需有關編碼和解碼規則的詳細資訊,請參閱TO_BASE64()
的描述。mysql> SELECT TO_BASE64('abc'), FROM_BASE64(TO_BASE64('abc')); -> 'JWJj', 'abc'
如果從 mysql 用戶端內叫用
FROM_BASE64()
,則會使用十六進位表示法顯示二進位字串。您可以在啟動 mysql 用戶端時,將--binary-as-hex
的值設定為0
,以停用此行為。如需有關該選項的詳細資訊,請參閱第 6.5.1 節,「mysql — MySQL 命令列用戶端」。對於字串引數
str
,HEX()
會傳回str
的十六進位字串表示法,其中str
中每個字元的每個位元組都會轉換為兩個十六進位數字。(因此,多位元組字元會變成兩個以上的數字。) 此操作的反向操作由UNHEX()
函式執行。對於數值引數
N
,HEX()
會傳回將N
視為 longlong (BIGINT
) 數值之十六進位字串表示法。這等同於CONV(
。此操作的反向操作由N
,10,16)CONV(HEX(
執行。N
),16,10)對於
NULL
引數,此函式會傳回NULL
。mysql> SELECT X'616263', HEX('abc'), UNHEX(HEX('abc')); -> 'abc', 616263, 'abc' mysql> SELECT HEX(255), CONV(HEX(255),16,10); -> 'FF', 255
傳回字串
str
,其中從位置pos
開始且長度為len
個字元的子字串會被字串newstr
取代。如果pos
不在字串長度範圍內,則傳回原始字串。如果len
不在字串剩餘長度範圍內,則會從位置pos
取代字串的剩餘部分。如果任何引數為NULL
,則傳回NULL
。mysql> SELECT INSERT('Quadratic', 3, 4, 'What'); -> 'QuWhattic' mysql> SELECT INSERT('Quadratic', -1, 4, 'What'); -> 'Quadratic' mysql> SELECT INSERT('Quadratic', 3, 100, 'What'); -> 'QuWhat'
此函式是多位元組安全的。
傳回子字串
substr
在字串str
中第一次出現的位置。這與LOCATE()
的雙引數形式相同,但引數順序已反轉。mysql> SELECT INSTR('foobarbar', 'bar'); -> 4 mysql> SELECT INSTR('xbar', 'foobar'); -> 0
此函式是多位元組安全的,且僅在至少有一個引數是二進位字串時才區分大小寫。如果任一引數為
NULL
,則此函式會傳回NULL
。在檢視中使用的
LCASE()
會在儲存檢視的定義時重寫為LOWER()
。(Bug #12844279)傳回字串
str
中最左邊的len
個字元,如果任何引數為NULL
,則傳回NULL
。mysql> SELECT LEFT('foobarbar', 5); -> 'fooba'
此函式是多位元組安全的。
傳回字串
str
的長度,以位元組為單位測量。多位元組字元算作多個位元組。這表示對於包含五個 2 位元組字元的字串,LENGTH()
會傳回10
,而CHAR_LENGTH()
會傳回5
。如果str
為NULL
,則傳回NULL
。mysql> SELECT LENGTH('text'); -> 4
注意OpenGIS 空間函式
Length()
在 MySQL 中命名為ST_Length()
。讀取檔案並傳回檔案內容作為字串。若要使用此函式,檔案必須位於伺服器主機上,您必須指定檔案的完整路徑名稱,而且您必須具有
FILE
權限。檔案必須可由伺服器讀取,且其大小必須小於max_allowed_packet
個位元組。如果secure_file_priv
系統變數設定為非空的目錄名稱,則要載入的檔案必須位於該目錄中。如果檔案不存在或無法讀取,因為不滿足先前的條件之一,則函式會傳回
NULL
。character_set_filesystem
系統變數會控制對以文字字串形式提供的檔案名稱的解譯。mysql> UPDATE t SET blob_col=LOAD_FILE('/tmp/picture') WHERE id=1;
LOCATE(
,substr
,str
)LOCATE(
substr
,str
,pos
)第一個語法會傳回子字串
substr
在字串str
中第一次出現的位置。第二個語法會傳回子字串substr
在字串str
中從位置pos
開始第一次出現的位置。如果substr
不在str
中,則傳回0
。如果任何引數為NULL
,則傳回NULL
。mysql> SELECT LOCATE('bar', 'foobarbar'); -> 4 mysql> SELECT LOCATE('xbar', 'foobar'); -> 0 mysql> SELECT LOCATE('bar', 'foobarbar', 5); -> 7
此函式是多位元組安全的,且僅在至少有一個引數是二進位字串時才區分大小寫。
傳回字串
str
,其中所有字元都根據目前的字元集對應變更為小寫,如果str
為NULL
,則傳回NULL
。預設字元集為utf8mb4
。mysql> SELECT LOWER('QUADRATICALLY'); -> 'quadratically'
LOWER()
(和UPPER()
) 在應用於二進位字串時 (BINARY
、VARBINARY
、BLOB
) 無效。若要對二進位字串執行字母大小寫轉換,請先使用適合儲存在字串中的資料的字元集,將其轉換為非二進位字串mysql> SET @str = BINARY 'New York'; mysql> SELECT LOWER(@str), LOWER(CONVERT(@str USING utf8mb4)); +-------------+------------------------------------+ | LOWER(@str) | LOWER(CONVERT(@str USING utf8mb4)) | +-------------+------------------------------------+ | New York | new york | +-------------+------------------------------------+
對於 Unicode 字元集的定序,如果定序名稱中有 Unicode 定序演算法 (UCA) 版本,則
LOWER()
和UPPER()
會依照該版本運作,如果未指定版本,則依照 UCA 4.0.0 運作。例如,utf8mb4_0900_ai_ci
和utf8mb3_unicode_520_ci
會分別依照 UCA 9.0.0 和 5.2.0 運作,而utf8mb3_unicode_ci
則依照 UCA 4.0.0 運作。請參閱第 12.10.1 節「Unicode 字元集」。此函式是多位元組安全的。
在檢視中使用的
LCASE()
會重寫為LOWER()
。傳回字串
str
,在左邊使用字串padstr
填補,直到長度達到len
個字元。如果str
比len
長,則傳回值會縮短為len
個字元。mysql> SELECT LPAD('hi',4,'??'); -> '??hi' mysql> SELECT LPAD('hi',1,'??'); -> 'h'
如果其任何引數為
NULL
,則傳回NULL
。傳回移除前導空格字元的字串
str
。如果str
為NULL
,則傳回NULL
。mysql> SELECT LTRIM(' barbar'); -> 'barbar'
此函式是多位元組安全的。
傳回一個設定值 (一個包含以
,
字元分隔的子字串的字串),其中包含在bits
中設定了對應位元的字串。str1
對應於位元 0、str2
對應於位元 1,依此類推。不會將str1
、str2
、...
中的NULL
值附加到結果。mysql> SELECT MAKE_SET(1,'a','b','c'); -> 'a' mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world'); -> 'hello,world' mysql> SELECT MAKE_SET(1 | 4,'hello','nice',NULL,'world'); -> 'hello' mysql> SELECT MAKE_SET(0,'a','b','c'); -> ''
傳回
N
的八進位值的字串表示法,其中N
是 longlong (BIGINT
) 數字。這等同於CONV(
。如果N
,10,8)N
為NULL
,則傳回NULL
。mysql> SELECT OCT(12); -> '14'
OCTET_LENGTH()
是LENGTH()
的同義詞。如果字串
str
最左邊的字元是多位元組字元,則傳回該字元的程式碼,該程式碼是使用此公式從其構成位元組的數值計算而得(1st byte code) + (2nd byte code * 256) + (3rd byte code * 256^2) ...
如果最左邊的字元不是多位元組字元,則
ORD()
會傳回與ASCII()
函式相同的值。如果str
為NULL
,則函式會傳回NULL
。mysql> SELECT ORD('2'); -> 50
將字串加上引號,以產生可在 SQL 陳述式中用作正確跳脫字元資料值的结果。傳回的字串會以單引號括住,且每個反斜線 (
\
)、單引號 ('
)、ASCIINUL
和 Control+Z 的實例前面都會加上反斜線。如果引數是NULL
,則傳回值為 「NULL」 這個詞,且不含括住的單引號。mysql> SELECT QUOTE('Don\'t!'); -> 'Don\'t!' mysql> SELECT QUOTE(NULL); -> NULL
若要比較,請參閱第 11.1.1 節「字串字面值」中的文字字串以及 C API 中的引號規則,以及mysql_real_escape_string_quote()。
傳回一個由字串
str
重複count
次所組成的字串。如果count
小於 1,則傳回空字串。如果str
或count
是NULL
,則傳回NULL
。mysql> SELECT REPEAT('MySQL', 3); -> 'MySQLMySQLMySQL'
傳回字串
str
,其中所有出現的字串from_str
都會被字串to_str
取代。REPLACE()
在搜尋from_str
時會執行區分大小寫的比對。mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww'); -> 'WwWwWw.mysql.com'
此函式是多位元組安全的。如果任何引數是
NULL
,則會傳回NULL
。傳回字元順序反轉的字串
str
,如果str
是NULL
,則傳回NULL
。mysql> SELECT REVERSE('abc'); -> 'cba'
此函式是多位元組安全的。
從字串
str
傳回最右邊的len
個字元,如果任何引數是NULL
,則傳回NULL
。mysql> SELECT RIGHT('foobarbar', 4); -> 'rbar'
此函式是多位元組安全的。
傳回字串
str
,並在右側以字串padstr
填補至len
個字元的長度。如果str
長度大於len
,則傳回值會縮短為len
個字元。如果str
、padstr
或len
是NULL
,則函式會傳回NULL
。mysql> SELECT RPAD('hi',5,'?'); -> 'hi???' mysql> SELECT RPAD('hi',1,'?'); -> 'h'
此函式是多位元組安全的。
傳回移除尾隨空格字元的字串
str
。mysql> SELECT RTRIM('barbar '); -> 'barbar'
此函式是多位元組安全的,且如果
str
是NULL
,則會傳回NULL
。從
str
傳回 soundex 字串,如果str
是NULL
,則傳回NULL
。聽起來幾乎相同的兩個字串應該具有相同的 soundex 字串。標準的 soundex 字串長度為四個字元,但是SOUNDEX()
函式會傳回任意長度的字串。您可以在結果上使用SUBSTRING()
來取得標準的 soundex 字串。系統會忽略str
中所有非字母字元。A-Z 範圍以外的所有國際字母字元都會被視為母音。重要使用
SOUNDEX()
時,您應該注意下列限制目前實作的此函式旨在與僅限英文的字串搭配良好運作。其他語言的字串可能不會產生可靠的結果。
此函式無法保證在使用多位元組字元集 (包括
utf-8
) 的字串時提供一致的結果。請參閱錯誤 #22638 以取得詳細資訊。
mysql> SELECT SOUNDEX('Hello'); -> 'H400' mysql> SELECT SOUNDEX('Quadratically'); -> 'Q36324'
注意此函式實作原始的 Soundex 演算法,而不是更常見的增強版本 (D. Knuth 也有描述)。差異在於原始版本會先捨棄母音,再捨棄重複字元,而增強版本則會先捨棄重複字元,再捨棄母音。
傳回一個由
N
個空格字元組成的字串,如果N
是NULL
,則傳回NULL
。mysql> SELECT SPACE(6); -> ' '
SUBSTR(
、str
,pos
)SUBSTR(
、str
FROMpos
)SUBSTR(
、str
,pos
,len
)SUBSTR(
str
FROMpos
FORlen
)SUBSTR()
是SUBSTRING()
的同義詞。SUBSTRING(
、str
,pos
)SUBSTRING(
、str
FROMpos
)SUBSTRING(
、str
,pos
,len
)SUBSTRING(
str
FROMpos
FORlen
)不含
len
引數的形式會從字串str
中傳回一個子字串,該子字串從位置pos
開始。含有len
引數的形式會從字串str
中傳回長度為len
個字元的子字串,該子字串從位置pos
開始。使用FROM
的形式是標準 SQL 語法。也可以使用pos
的負值。在此情況下,子字串的開頭是從字串結尾算起的pos
個字元,而不是從開頭算起。在此函式的任何形式中,都可以將負值用於pos
。pos
的值為 0 會傳回空字串。對於所有形式的
SUBSTRING()
,從中擷取子字串的字串中第一個字元的位置會計算為1
。mysql> SELECT SUBSTRING('Quadratically',5); -> 'ratically' mysql> SELECT SUBSTRING('foobarbar' FROM 4); -> 'barbar' mysql> SELECT SUBSTRING('Quadratically',5,6); -> 'ratica' mysql> SELECT SUBSTRING('Sakila', -3); -> 'ila' mysql> SELECT SUBSTRING('Sakila', -5, 3); -> 'aki' mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2); -> 'ki'
此函式是多位元組安全的。如果任何引數是
NULL
,則會傳回NULL
。如果
len
小於 1,則結果為空字串。SUBSTRING_INDEX(
str
,delim
,count
)從字串
str
中傳回分隔符delim
的count
次出現之前/之後的子字串。如果count
為正數,則會傳回最後一個分隔符 (從左邊算起) 的左邊所有內容。如果count
為負數,則會傳回最後一個分隔符 (從右邊算起) 的右邊所有內容。SUBSTRING_INDEX()
在搜尋delim
時會執行區分大小寫的比對。mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); -> 'www.mysql' mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2); -> 'mysql.com'
此函式是多位元組安全的。
如果任何引數是
NULL
,SUBSTRING_INDEX()
會傳回NULL
。將字串引數轉換為 base-64 編碼形式,並以連線字元集和定序傳回結果作為字元字串。如果引數不是字串,則會在轉換前將其轉換為字串。如果引數是
NULL
,則結果為NULL
。可以使用FROM_BASE64()
函式來解碼 Base-64 編碼字串。mysql> SELECT TO_BASE64('abc'), FROM_BASE64(TO_BASE64('abc')); -> 'JWJj', 'abc'
存在不同的 base-64 編碼配置。以下是
TO_BASE64()
和FROM_BASE64()
使用的編碼和解碼規則字母值 62 的編碼為
'+'
。字母值 63 的編碼為
'/'
。編碼輸出由 4 個可列印字元組所組成。輸入資料的每個 3 個位元組都會使用 4 個字元進行編碼。如果最後一個群組不完整,則會以
'='
字元填補至長度為 4。編碼輸出的每 76 個字元後會加入一個換行符號,以將長輸出分成多行。
解碼會識別並忽略換行符號、歸位字元、索引標籤和空格。
TRIM([{BOTH | LEADING | TRAILING} [
、remstr
] FROM]str
)TRIM([
remstr
FROM]str
)傳回移除所有
remstr
前置詞或後置詞的字串str
。如果未提供BOTH
、LEADING
或TRAILING
等指定詞,則會假設為BOTH
。remstr
是選用的,如果未指定,則會移除空格。mysql> SELECT TRIM(' bar '); -> 'bar' mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx'); -> 'barxxx' mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx'); -> 'bar' mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz'); -> 'barx'
此函式是多位元組安全的。如果任何引數是
NULL
,則會傳回NULL
。在檢視中使用的
UCASE()
會重新寫為UPPER()
。對於字串引數
str
,UNHEX(
會將引數中的每一對字元解譯為十六進位數字,並將其轉換為數字表示的位元組。傳回值是二進位字串。str
)mysql> SELECT UNHEX('4D7953514C'); -> 'MySQL' mysql> SELECT X'4D7953514C'; -> 'MySQL' mysql> SELECT UNHEX(HEX('string')); -> 'string' mysql> SELECT HEX(UNHEX('1267')); -> '1267'
引數字串中的字元必須是合法的十六進位數字:
'0'
..'9'
、'A'
..'F'
、'a'
..'f'
。如果引數包含任何非十六進位數字,或者本身為NULL
,則結果為NULL
。mysql> SELECT UNHEX('GG'); +-------------+ | UNHEX('GG') | +-------------+ | NULL | +-------------+ mysql> SELECT UNHEX(NULL); +-------------+ | UNHEX(NULL) | +-------------+ | NULL | +-------------+
如果
UNHEX()
的引數是一個BINARY
欄位,也可能會產生NULL
的結果,因為值在儲存時會用0x00
位元組填充,但在檢索時不會移除這些位元組。例如,'41'
會以'41 '
的形式儲存到CHAR(3)
欄位中,並以'41'
的形式檢索(尾隨的填充空格會被移除),因此欄位值的UNHEX()
會傳回X'41'
。 相反地,'41'
會以'41\0'
的形式儲存到BINARY(3)
欄位中,並以'41\0'
的形式檢索(尾隨的填充0x00
位元組不會被移除)。'\0'
不是合法的十六進位數字,因此欄位值的UNHEX()
會傳回NULL
。對於數值引數
N
,UNHEX()
不會執行HEX(
的反向操作。請改用N
)CONV(HEX(
。請參閱N
),16,10)HEX()
的描述。如果從 mysql 用戶端內呼叫
UNHEX()
,二進位字串會使用十六進位表示法顯示,這取決於--binary-as-hex
的值。有關該選項的更多資訊,請參閱第 6.5.1 節,「mysql — MySQL 命令列用戶端」。根據目前的字元集對應,傳回字串
str
中所有字元都變為大寫的結果,如果str
為NULL
,則傳回NULL
。預設的字元集為utf8mb4
。mysql> SELECT UPPER('Hej'); -> 'HEJ'
請參閱
LOWER()
的描述,其中包含也適用於UPPER()
的資訊。這包括如何對二進位字串(BINARY
、VARBINARY
、BLOB
)執行字母大小寫轉換(這些函式對它們無效),以及有關 Unicode 字元集的大小寫摺疊的資訊。此函式是多位元組安全的。
在檢視中使用的
UCASE()
會重新寫為UPPER()
。WEIGHT_STRING(
str
[AS {CHAR|BINARY}(N
)] [flags
])此函式傳回輸入字串的權重字串。傳回值是一個二進位字串,表示字串的比較和排序值;如果引數為
NULL
,則傳回NULL
。它具有以下屬性:如果
WEIGHT_STRING(
=str1
)WEIGHT_STRING(
,則str2
)
(str1
=str2
str1
和str2
被視為相等)如果
WEIGHT_STRING(
<str1
)WEIGHT_STRING(
,則str2
)
(str1
<str2
str1
在str2
之前排序)
WEIGHT_STRING()
是一個用於內部使用的除錯函式。其行為可能會在 MySQL 版本之間變更,恕不另行通知。它可以用於排序規則的測試和除錯,尤其是在您新增新的排序規則時。請參閱第 12.14 節,「為字元集新增排序規則」。此清單簡要總結了引數。更多詳細資訊將在清單之後的討論中提供。
str
:輸入字串運算式。AS
子句:可選;將輸入字串轉換為給定的類型和長度。flags
:可選;未使用。
輸入字串
str
是一個字串運算式。如果輸入是非二進位(字元)字串,例如CHAR
、VARCHAR
或TEXT
值,則傳回值包含該字串的排序規則權重。如果輸入是二進位(位元組)字串,例如BINARY
、VARBINARY
或BLOB
值,則傳回值與輸入相同(二進位字串中每個位元組的權重都是位元組值)。如果輸入為NULL
,則WEIGHT_STRING()
會傳回NULL
。範例
mysql> SET @s = _utf8mb4 'AB' COLLATE utf8mb4_0900_ai_ci; mysql> SELECT @s, HEX(@s), HEX(WEIGHT_STRING(@s)); +------+---------+------------------------+ | @s | HEX(@s) | HEX(WEIGHT_STRING(@s)) | +------+---------+------------------------+ | AB | 4142 | 1C471C60 | +------+---------+------------------------+
mysql> SET @s = _utf8mb4 'ab' COLLATE utf8mb4_0900_ai_ci; mysql> SELECT @s, HEX(@s), HEX(WEIGHT_STRING(@s)); +------+---------+------------------------+ | @s | HEX(@s) | HEX(WEIGHT_STRING(@s)) | +------+---------+------------------------+ | ab | 6162 | 1C471C60 | +------+---------+------------------------+
mysql> SET @s = CAST('AB' AS BINARY); mysql> SELECT @s, HEX(@s), HEX(WEIGHT_STRING(@s)); +------+---------+------------------------+ | @s | HEX(@s) | HEX(WEIGHT_STRING(@s)) | +------+---------+------------------------+ | AB | 4142 | 4142 | +------+---------+------------------------+
mysql> SET @s = CAST('ab' AS BINARY); mysql> SELECT @s, HEX(@s), HEX(WEIGHT_STRING(@s)); +------+---------+------------------------+ | @s | HEX(@s) | HEX(WEIGHT_STRING(@s)) | +------+---------+------------------------+ | ab | 6162 | 6162 | +------+---------+------------------------+
前面的範例使用
HEX()
來顯示WEIGHT_STRING()
的結果。由於結果是二進位值,因此當結果包含不可列印的值時,HEX()
特別有用,可以用可列印的形式顯示它。mysql> SET @s = CONVERT(X'C39F' USING utf8mb4) COLLATE utf8mb4_czech_ci; mysql> SELECT HEX(WEIGHT_STRING(@s)); +------------------------+ | HEX(WEIGHT_STRING(@s)) | +------------------------+ | 0FEA0FEA | +------------------------+
對於非
NULL
的傳回值,如果值的長度在VARBINARY
的最大長度範圍內,則值的資料類型為VARBINARY
,否則資料類型為BLOB
。可以指定
AS
子句,將輸入字串轉換為非二進位或二進位字串,並強制其具有給定的長度。AS CHAR(
將字串轉換為非二進位字串,並在右側用空格填充,使其長度達到N
)N
個字元。N
必須至少為 1。如果N
小於輸入字串的長度,則該字串會被截斷為N
個字元。截斷不會發生警告。AS BINARY(
類似,但會將字串轉換為二進位字串,N
)N
以位元組為單位(不是字元),並且填充會使用0x00
位元組(不是空格)。
mysql> SET NAMES 'latin1'; mysql> SELECT HEX(WEIGHT_STRING('ab' AS CHAR(4))); +-------------------------------------+ | HEX(WEIGHT_STRING('ab' AS CHAR(4))) | +-------------------------------------+ | 41422020 | +-------------------------------------+ mysql> SET NAMES 'utf8mb4'; mysql> SELECT HEX(WEIGHT_STRING('ab' AS CHAR(4))); +-------------------------------------+ | HEX(WEIGHT_STRING('ab' AS CHAR(4))) | +-------------------------------------+ | 1C471C60 | +-------------------------------------+
mysql> SELECT HEX(WEIGHT_STRING('ab' AS BINARY(4))); +---------------------------------------+ | HEX(WEIGHT_STRING('ab' AS BINARY(4))) | +---------------------------------------+ | 61620000 | +---------------------------------------+
flags
子句目前未使用。如果從 mysql 用戶端內呼叫
WEIGHT_STRING()
,二進位字串會使用十六進位表示法顯示,這取決於--binary-as-hex
的值。有關該選項的更多資訊,請參閱第 6.5.1 節,「mysql — MySQL 命令列用戶端」。