• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 字符串比较函数和运算符

    表字符串比较函数和运算符

    名称描述
    LIKE简单模式匹配
    NOT LIKE否定简单模式匹配
    STRCMP()比较两个字符串

    如果给字符串函数一个二进制字符串作为参数,则结果字符串也是二进制字符串。转换为字符串的数字被视为二进制字符串。这仅影响比较。

    通常,如果字符串比较中的任何表达式区分大小写,则以区分大小写的方式执行比较。

    • expr LIKE pat[ESCAPE 'escape_char']

      使用SQL模式进行模式匹配。返回1TRUE)或0FALSE)。如果任一expr或者patNULL,结果是NULL

      该模式不必是文字字符串。例如,可以将其指定为字符串表达式或表列。

      根据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 	|
      +--------------------------------------	+
      

      特别是尾随空格很重要,这不适用于运算符CHARVARCHAR=运算符进行比较:

      mysql> SELECT 'a' = 'a ', 'a' LIKE 'a ';
      +------------	+---------------	+
      | 'a' = 'a ' 	| 'a' LIKE 'a ' 	|
      +------------	+---------------	+
      |          1 	|             0 	|
      +------------	+---------------	+
      1 row in set (0.00 sec)
      

      有了LIKE可以使用的图案以下两个通配符:

      • %匹配任意数量的字符,甚至零个字符。
      • _完全匹配一个字符。
      mysql> SELECT 'David!' LIKE 'David_';
      -> 1
      mysql> SELECT 'David!' LIKE '%D%v%';
      -> 1
      

      要测试通配符的文字实例,请在其前面加上转义符。如果未指定ESCAPE字符,\则假定为。

      • \%匹配一个%字符。
      • \_匹配一个_字符。
      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在字符串中使用C转义语法(例如,\n表示换行符),因此必须\将在LIKE字符串中使用的任何内容加倍。例如,要搜索\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'])

      注意

      涉及NOT LIKE与包含列的比较的聚合查询NULL可能会产生意外的结果。例如,考虑下表和数据:

      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 exprNULLexprNULLNOT RLIKENOT REGEXPNOT NULLORAND

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

      STRCMP()0如果字符串相同,-1则返回;如果根据当前的排序顺序,第一个参数小于第二个参数,则返回;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 	|
      +------------------	+------------------	+
      

      如果校验规则不兼容,则必须将其中一个参数转换为与另一个兼容。请参见“表达式中的校验规则强制性”。

      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 	|
      +---------------------------------------------	+