暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的函数和运算符 - 字符串比较函数和运算符

数据库杂货铺 2021-06-22
737
字符串比较函数和运算符
 
名称
介绍
LIKE
简单模式匹配
NOT LIKE
简单模式匹配的否定
STRCMP()
比较两个字符串
 
如果给字符串函数一个二进制字符串作为参数,则得到的字符串也是二进制字符串。转换为字符串的数字被视为二进制字符串。这只影响比较。
 
通常,如果字符串比较中的任何表达式区分大小写,则以区分大小写的方式执行比较。
 
如果从 mysql 客户端中调用字符串函数,则二进制字符串将使用十六进制表示法显示,具体取决于 --binary-as-hex 的值。
 
● expr LIKE pat [ESCAPE 'escape_char']
 
使用 SQL 模式进行模式匹配。返回 1TRUE)或0FALSE)。如果 expr  pat  NULL,则结果为 NULL
 
模式不必是字面量字符串。例如,可以将其指定为字符串表达式或表的某列。在后一种情况下,必须将列定义为 MySQL 字符串类型之一。
 
根据 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 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 在字符串中使用 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 RLIKE NOT REGEXP 进行比较的聚合查询也是如此。在这种情况下,必须使用 OR 显式测试 NOT NULL,如下所示:
                     
                      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 |
                            +---------------------------------------------+
                             
                             
                             
                            官方文档:
                            https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html
                            文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论