文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美國 Letter) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  字串比較函數與運算符

14.8.1 字串比較函數與運算符

表 14.13 字串比較函數與運算符

名稱 描述
LIKE 簡單模式比對
NOT LIKE 簡單模式比對的否定
STRCMP() 比較兩個字串

如果字串函數的引數是二進位字串,則產生的字串也會是二進位字串。轉換為字串的數字會被視為二進位字串。這只會影響比較。

通常,如果字串比較中的任何表達式區分大小寫,則比較會以區分大小寫的方式執行。

如果從 mysql 用戶端內叫用字串函數,則會使用十六進位表示法顯示二進位字串,這取決於 --binary-as-hex 的值。如需該選項的詳細資訊,請參閱 章節 6.5.1,「mysql — MySQL 命令列用戶端」

  • expr LIKE pat [ESCAPE 'escape_char']

    使用 SQL 模式進行模式比對。傳回 1 (TRUE) 或 0 (FALSE)。如果 exprpatNULL,則結果為 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 |
    +--------------------------------------+

    尤其是,尾隨空格始終很重要。這與使用 = 運算符執行的比較不同,對於此運算符,非二進位字串 (CHARVARCHARTEXT 值) 中尾隨空格的重要性取決於用於比較的校對的填補屬性。如需詳細資訊,請參閱 比較中的尾隨空格處理

    使用 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 LIKE pat [ESCAPE 'escape_char']

    這與 NOT (expr LIKE pat [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 RLIKENOT REGEXP 的比較的聚合查詢也是如此。在這種情況下,您必須使用 OR(而不是 AND)顯式測試 NOT NULL,如下所示

    SELECT COUNT(*) FROM foo WHERE bar NOT LIKE '%baz%' OR bar IS NULL;
  • STRCMP(expr1,expr2)

    如果字串相同,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 |
    +---------------------------------------------+