文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙尺寸) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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)。如果 exprpat 任一者為 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 |
    +--------------------------------------+

    特別是,尾隨空格始終很重要。這與使用 = 運算子執行的比較不同,對於非二進位字串 (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 |
    +---------------------------------------------+