表 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
值。如果
N
=1
,則ELT()
傳回字串清單的第N
個元素: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()
的所有引數都是字串,則所有引數都會作為字串進行比較。如果所有引數都是數字,則會作為數字進行比較。否則,引數會作為雙精度數進行比較。如果
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()
。(錯誤 #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
中首次出現的位置。第二個語法會回傳從位置pos
開始,子字串substr
在字串str
中首次出現的位置。如果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'
當套用至二進位字串 (
BINARY
、VARBINARY
、BLOB
) 時,LOWER()
(和UPPER()
)無效。若要對二進位字串執行字母大小寫轉換,請先使用適用於字串中儲存之資料的字元集,將其轉換為非二進位字串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 節, 「字串文字」以及mysql_real_escape_string_quote()中,字串文字和 C API 內的引號規則。
傳回一個由字串
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
中,從位置pos
開始,長度為len
個字元的子字串。使用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
為負數,則傳回最後一個定界符(從右邊算起)右邊的所有內容。搜尋delim
時,SUBSTRING_INDEX()
會執行區分大小寫的匹配。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 個字元後會加上一個換行符號,將長輸出分成多行。
解碼會辨識並忽略換行符號、歸位字元、Tab 和空格。
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 命令列用戶端」。