如果字串函數的引數是二進位字串,則結果字串也會是二進位字串。轉換為字串的數字會被視為二進位字串。這只會影響比較。
通常,如果字串比較中的任何表達式區分大小寫,則比較會以區分大小寫的方式執行。
如果字串函數是從 mysql 用戶端內調用的,則二進位字串會以十六進位符號顯示,具體取決於 --binary-as-hex
的值。有關該選項的詳細資訊,請參閱 第 6.5.1 節, 「mysql — MySQL 命令列用戶端」。
expr
LIKEpat
[ESCAPE 'escape_char
']使用 SQL 模式進行模式比對。傳回
1
(TRUE
) 或0
(FALSE
)。如果expr
或pat
任一者為NULL
,則結果為NULL
。模式不需要是文字字串。例如,它可以指定為字串表達式或資料表欄。在後者的情況下,該欄必須定義為 MySQL 字串類型之一 (請參閱 第 13.3 節,「字串資料類型」)。
根據 SQL 標準,
LIKE
會逐字元進行比對,因此它產生的結果可能與=
比較運算子不同。mysql> SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci; +-----------------------------------------+ | 'ä' LIKE 'ae' COLLATE latin1_german2_ci | +-----------------------------------------+ | 0 | +-----------------------------------------+ mysql> SELECT 'ä' = 'ae' COLLATE latin1_german2_ci; +--------------------------------------+ | 'ä' = 'ae' COLLATE latin1_german2_ci | +--------------------------------------+ | 1 | +--------------------------------------+
特別是,尾隨空格始終很重要。這與使用
=
運算子執行的比較不同,對於非二進位字串 (CHAR
、VARCHAR
和TEXT
值),尾隨空格的重要性取決於用於比較的校對的填補屬性。有關詳細資訊,請參閱比較中的尾隨空格處理。使用
LIKE
,您可以在模式中使用以下兩個萬用字元%
符合任意數量的字元,甚至是零個字元。_
符合恰好一個字元。
mysql> SELECT 'David!' LIKE 'David_'; -> 1 mysql> SELECT 'David!' LIKE '%D%v%'; -> 1
若要測試萬用字元的文字實例,請在萬用字元前面加上逸出字元。如果您未指定
ESCAPE
字元,則會假定為\
,除非啟用了NO_BACKSLASH_ESCAPES
SQL 模式。在該情況下,不會使用逸出字元。\%
符合一個%
字元。\_
符合一個_
字元。
mysql> SELECT 'David!' LIKE 'David\_'; -> 0 mysql> SELECT 'David_' LIKE 'David\_'; -> 1
若要指定不同的逸出字元,請使用
ESCAPE
子句mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|'; -> 1
逸出序列應為一個字元長,以指定逸出字元,或為空,以指定不使用逸出字元。表達式必須在執行時評估為常數。如果啟用
NO_BACKSLASH_ESCAPES
SQL 模式,則序列不能為空。以下陳述式說明,除非其中一個運算元區分大小寫(使用區分大小寫的校對或為二進位字串),否則字串比較不區分大小寫。
mysql> SELECT 'abc' LIKE 'ABC'; -> 1 mysql> SELECT 'abc' LIKE _utf8mb4 'ABC' COLLATE utf8mb4_0900_as_cs; -> 0 mysql> SELECT 'abc' LIKE _utf8mb4 'ABC' COLLATE utf8mb4_bin; -> 0 mysql> SELECT 'abc' LIKE BINARY 'ABC'; -> 0
作為標準 SQL 的延伸,MySQL 允許對數值表達式使用
LIKE
。mysql> SELECT 10 LIKE '1%'; -> 1
在這種情況下,MySQL 會嘗試將運算式隱式轉換為字串。請參閱第 14.3 節,「運算式評估中的類型轉換」。
注意MySQL 在字串中使用 C 跳脫語法(例如,
\n
代表換行字元)。如果您希望LIKE
字串包含字面上的\
,您必須將其加倍。(除非啟用NO_BACKSLASH_ESCAPES
SQL 模式,在這種情況下,不會使用跳脫字元。)例如,要搜尋\n
,請將其指定為\\n
。要搜尋\
,請將其指定為\\\\
;這是因為反斜線會被剖析器移除一次,並且在進行模式比對時再次移除,只留下一個反斜線進行比對。例外:在模式字串的末尾,反斜線可以指定為
\\
。在字串的末尾,反斜線代表它自己,因為後面沒有任何內容需要跳脫。假設表格包含以下值mysql> SELECT filename FROM t1; +--------------+ | filename | +--------------+ | C: | | C:\ | | C:\Programs | | C:\Programs\ | +--------------+
若要測試以反斜線結尾的值,您可以使用下列任一模式來比對這些值
mysql> SELECT filename, filename LIKE '%\\' FROM t1; +--------------+---------------------+ | filename | filename LIKE '%\\' | +--------------+---------------------+ | C: | 0 | | C:\ | 1 | | C:\Programs | 0 | | C:\Programs\ | 1 | +--------------+---------------------+ mysql> SELECT filename, filename LIKE '%\\\\' FROM t1; +--------------+-----------------------+ | filename | filename LIKE '%\\\\' | +--------------+-----------------------+ | C: | 0 | | C:\ | 1 | | C:\Programs | 0 | | C:\Programs\ | 1 | +--------------+-----------------------+
expr
NOT LIKEpat
[ESCAPE 'escape_char
']這與
NOT (
相同。expr
LIKEpat
[ESCAPE 'escape_char
'])注意包含
NULL
的欄位,使用NOT LIKE
比較運算子的彙總查詢可能會產生非預期的結果。例如,請考慮以下表格和資料CREATE TABLE foo (bar VARCHAR(10)); INSERT INTO foo VALUES (NULL), (NULL);
查詢
SELECT COUNT(*) FROM foo WHERE bar LIKE '%baz%';
會傳回0
。您可能會假設SELECT COUNT(*) FROM foo WHERE bar NOT LIKE '%baz%';
會傳回2
。然而,情況並非如此:第二個查詢會傳回0
。這是因為NULL NOT LIKE
始終會傳回expr
NULL
,無論expr
的值為何。對於包含NULL
,並使用NOT RLIKE
或NOT REGEXP
進行比較的彙總查詢,情況也是如此。在這種情況下,您必須使用OR
(而不是AND
)來明確測試NOT NULL
,如下所示SELECT COUNT(*) FROM foo WHERE bar NOT LIKE '%baz%' OR bar IS NULL;
如果字串相同,
STRCMP()
會傳回0
;如果根據目前的排序順序,第一個引數小於第二個引數,則傳回-1
;如果任一引數為NULL
,則傳回NULL
。否則,傳回1
。mysql> SELECT STRCMP('text', 'text2'); -> -1 mysql> SELECT STRCMP('text2', 'text'); -> 1 mysql> SELECT STRCMP('text', 'text'); -> 0
STRCMP()
使用引數的排序規則執行比較。mysql> SET @s1 = _utf8mb4 'x' COLLATE utf8mb4_0900_ai_ci; mysql> SET @s2 = _utf8mb4 'X' COLLATE utf8mb4_0900_ai_ci; mysql> SET @s3 = _utf8mb4 'x' COLLATE utf8mb4_0900_as_cs; mysql> SET @s4 = _utf8mb4 'X' COLLATE utf8mb4_0900_as_cs; mysql> SELECT STRCMP(@s1, @s2), STRCMP(@s3, @s4); +------------------+------------------+ | STRCMP(@s1, @s2) | STRCMP(@s3, @s4) | +------------------+------------------+ | 0 | -1 | +------------------+------------------+
如果排序規則不相容,則必須轉換其中一個引數,使其與另一個引數相容。請參閱第 12.8.4 節,「運算式中的排序規則強制性」。
mysql> SET @s1 = _utf8mb4 'x' COLLATE utf8mb4_0900_ai_ci; mysql> SET @s2 = _utf8mb4 'X' COLLATE utf8mb4_0900_ai_ci; mysql> SET @s3 = _utf8mb4 'x' COLLATE utf8mb4_0900_as_cs; mysql> SET @s4 = _utf8mb4 'X' COLLATE utf8mb4_0900_as_cs; --> mysql> SELECT STRCMP(@s1, @s3); ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_0900_as_cs,IMPLICIT) for operation 'strcmp' mysql> SELECT STRCMP(@s1, @s3 COLLATE utf8mb4_0900_ai_ci); +---------------------------------------------+ | STRCMP(@s1, @s3 COLLATE utf8mb4_0900_ai_ci) | +---------------------------------------------+ | 0 | +---------------------------------------------+