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

MySQL的函数和运算符 - 字符串函数和运算符(3)

数据库杂货铺 2021-06-21
438
● SOUNDEX(str)
 
返回 str  soundex(声音索引) 字符串。两个发音几乎相同的字符串应该具有相同的声音索引字符串。标准的声音索引字符串是四个字符长,但是 SOUNDEX() 函数返回任意长的字符串。可以对结果使用 SUBSTRING() 来获取标准的声音索引字符串。str 中的所有非字母字符都被忽略。A-Z 范围以外的所有国际字母字符都被视为元音。
 
重要
使用 SOUNDEX() 时,应注意以下限制:
 
■ 目前实现的这个函数可以很好地处理只使用英语的字符串。其他语言的字符串可能不会产生可靠的结果。
 
■ 此函数不能保证为使用多字节字符集(包括utf-8)的字符串提供一致的结果。
 
    mysql> SELECT SOUNDEX('Hello');
    -> 'H400'
    mysql> SELECT SOUNDEX('Quadratically');
    -> 'Q36324'
     
    注意
     
    这个函数实现了原始的 Soundex 算法,而不是更流行的增强版(也称为 D. Knuth)。不同之处在于,原始版本首先丢弃元音,然后是重复,而增强版本则首先丢弃重复,然后是元音。
     
    ● expr1 SOUNDS LIKE expr2
     
    这与 SOUNDEX(expr1) = SOUNDEX(expr2) 相同。
     
    ● SPACE(N)
     
    返回由 N 个空格字符组成的字符串。
     
      mysql> SELECT SPACE(6);
      -> ' '
       
      ● SUBSTR(str,pos), SUBSTR(str FROM pos), SUBSTR(str,pos,len), SUBSTR(str FROM pos FOR len)
       
      SUBSTR() SUBSTRING() 的同义词。
       
      ● SUBSTRING(str,pos), SUBSTRING(str FROM pos), SUBSTRING(str,pos,len), SUBSTRING(str FROM pos FOR len)
       
      不带 len 参数的形式返回从字符串 str  pos 位置开始的子字符串。带 len 参数的形式返回从字符串 str  pos 位置开始的 len 个字符的子字符串。使用 FROM 的形式是标准 SQL 语法。pos 也可以使用负值。在这种情况下,子字符串的开头是从字符串开始末尾的第 pos 字符,而不是开头。此函数的任何形式的 pos 都可以使用负值。pos 的值为 0 将返回空字符串(长度为0)。
       
      对于 SUBSTRING() 的所有形式,要从中提取子字符串的字符串中第一个字符的位置都被认为是 1
       
        mysql> SELECT SUBSTRING('Quadratically',5);
        -> 'ratically'
        mysql> SELECT SUBSTRING('foobarbar' FROM 4);
        -> 'barbar'
        mysql> SELECT SUBSTRING('Quadratically',5,6);
        -> 'ratica'
        mysql> SELECT SUBSTRING('Sakila', -3);
        -> 'ila'
        mysql> SELECT SUBSTRING('Sakila', -5, 3);
        -> 'aki'
        mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
        -> 'ki'
         
        此函数是多字节安全的。
         
        如果 len 小于 1,则结果为空字符串(长度为0的字符串)。
         
        ● SUBSTRING_INDEX(str,delim,count)
         
        在分隔符 delim 出现 count 次之前,返回字符串 str 的子字符串。如果 count 为正,则返回最后定界符左侧的所有内容(从左侧开始计数)。如果 count 为负数,则返回最后定界符右侧的所有内容(从右侧开始计数)。SUBSTRING_INDEX() 在搜索 delim 时区分大小写。
         
          mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
          -> 'www.mysql'
          mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
          -> 'mysql.com'
           
          此函数是多字节安全的。
           
          ● TO_BASE64(str)
           
          将字符串参数转换为 base-64 编码形式,并将带有连接字符集和排序规则的结果作为字符串返回。如果参数不是字符串,则在转换之前将其转换为字符串。如果参数为 NULL,则结果为 NULLBase-64 编码的字符串可以使用 FROM_BASE64() 函数进行解码。
           
            mysql> SELECT TO_BASE64('abc'), FROM_BASE64(TO_BASE64('abc'));
            -> 'JWJj', 'abc'
             
            存在不同的 base-64 编码方案。以下是 TO_BASE64() FROM_BASE64() 使用的编码和解码规则:
             
            ■ 字母表值62的编码为 '+'
             
            ■ 字母表值63的编码为 '/'
             
            ■ 编码输出由多组字符组成,每组包含4个可打印字符。输入数据的每3个字节用4个字符编码。如果最后一组不完整,则用 '=' 字符填充到长度为 4
             
            ■ 在编码输出的每76个字符后添加一个换行符,将长输出分成多行。
             
            ■ 解码识别并忽略换行符、回车符、制表符和空格。
             
            ● TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str), TRIM([remstr FROM] str)
             
            返回删除了所有 remstr 前缀或后缀的字符串 str。如果没有给定说明符 BOTHLEADING TRAILING,则默认给定 BOTHremstr 是可选的,如果未指定,则删除空格。
             
              mysql> SELECT TRIM('  bar   ');
              -> 'bar'
              mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
              -> 'barxxx'
              mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
              -> 'bar'
              mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
              -> 'barx'
               
              此函数是多字节安全的。
               
              ● UCASE(str)
               
              UCASE() UPPER() 的同义词。
               
              在视图中使用的 UCASE() 被重写为 UPPER()
               
              ● UNHEX(str)
               
              对于字符串参数 strUNHEX(str) 将参数中的每对字符识别为十六进制数,并将其转换为该数字表示的字节。返回值是二进制字符串。
               
                mysql> SELECT UNHEX('4D7953514C');
                -> 'MySQL'
                mysql> SELECT X'4D7953514C';
                -> 'MySQL'
                mysql> SELECT UNHEX(HEX('string'));
                -> 'string'
                mysql> SELECT HEX(UNHEX('1267'));
                -> '1267'
                 
                参数字符串中的字符必须是合法的十六进制数字:'0' .. '9', 'A' .. 'F', 'a' .. 'f'。如果参数包含任何非十六进制数字,则结果为 NULL
                 
                  mysql> SELECT UNHEX('GG');
                  +-------------+
                  | UNHEX('GG') |
                  +-------------+
                  | NULL |
                  +-------------+
                   
                  如果 UNHEX() 的参数是 BINARY 列,则会出现 NULL 结果,因为值存储时会用 0x00 字节填充值,但在检索时不会剥离这些字节。例如,'41' CHAR(3) 列中存储为 '41 ',并作为 '41' 参与检索(去掉尾随空格),因此列值的 UNHEX() 返回 X'41'。相比之下,'41' BINARY(3) 列中存储为 '41\0',并作为 '41\0' 参与检索(尾部填充 0x00 字节未剥离),'\0' 不是合法的十六进制数字,因此列值的 UNHEX() 返回 NULL
                   
                  对于数值参数 N UNHEX() 不执行 HEX(N) 的逆运算。请改用 CONV(HEX(N),16,10)。请参见 HEX() 的说明。
                   
                  如果从 mysql 客户端中调用 UNHEX(),则二进制字符串将使用十六进制表示法显示,具体取决于 --binary-as-hex 的值。
                   
                  ● UPPER(str)
                   
                  返回字符串 str,其中所有字符根据当前字符集映射更改为大写。默认字符集为 utf8mb4
                   
                    mysql> SELECT UPPER('Hej');
                    -> 'HEJ'
                     
                    有关同样适用于 UPPER() 的信息,请参见 LOWER() 的说明。这包括有关如何对这些函数无效的二进制字符串( BINARYVARBINARYBLOB)执行字母大小写转换的信息,以及有关 Unicode 字符集的大小写转换的信息。
                     
                    此函数是多字节安全的。
                     
                    视图中使用的 UCASE() 重写为 UPPER()
                     
                    ● WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [flags])
                     
                    此函数返回输入字符串的权重字符串。返回值是一个二进制字符串,表示字符串的比较和排序值。它具有以下特性:
                     
                    ■ 如果 WEIGHT_STRING(str1) = WEIGHT_STRING(str2),则 str1 = str2str1  str2 被认为相等)
                     
                    ■ 如果 WEIGHT_STRING(str1) < WEIGHT_STRING(str2),则 str1 < str2str1 排序在 str2 之前)
                     
                    WEIGHT_STRING() 是一个用于内部使用的调试函数。在 MySQL 版本之间,它的行为可以在没有通知的情况下更改。它可以用于测试和调试排序规则,特别是在添加新排序规则时。
                     
                    下面简要地总结了这些参数。更多细节在下面的讨论中给出。
                     
                    ■ str:输入字符串表达式。
                     
                    ■ AS 子句:可选;将输入字符串强制转换为给定的类型和长度。
                     
                    ■ flags:可选;未使用。
                     
                    输入字符串 str 是一个字符串表达式。如果输入是非二进制(字符)字符串(如 CHARVARCHAR TEXT 值),则返回值包含该字符串的排序规则权重。如果输入是二进制(字节)字符串,如 BINARYVARBINARY BLOB 值,则返回值与输入值相同(二进制字符串中每个字节的权重为字节值)。如果输入为 NULLWEIGHT_STRING() 将返回 NULL
                     
                    示例:
                     
                      mysql> SET @s = _utf8mb4 'AB' COLLATE utf8mb4_0900_ai_ci;
                      mysql> SELECT @s, HEX(@s), HEX(WEIGHT_STRING(@s));
                      +------+---------+------------------------+
                      | @s | HEX(@s) | HEX(WEIGHT_STRING(@s)) |
                      +------+---------+------------------------+
                      | AB | 4142 | 1C471C60 |
                      +------+---------+------------------------+
                       
                        mysql> SET @s = _utf8mb4 'ab' COLLATE utf8mb4_0900_ai_ci;
                        mysql> SELECT @s, HEX(@s), HEX(WEIGHT_STRING(@s));
                        +------+---------+------------------------+
                        | @s | HEX(@s) | HEX(WEIGHT_STRING(@s)) |
                        +------+---------+------------------------+
                        | ab | 6162 | 1C471C60 |
                        +------+---------+------------------------+
                          mysql> SET @s = CAST('AB' AS BINARY);
                          mysql> SELECT @s, HEX(@s), HEX(WEIGHT_STRING(@s));
                          +------+---------+------------------------+
                          | @s | HEX(@s) | HEX(WEIGHT_STRING(@s)) |
                          +------+---------+------------------------+
                          | AB | 4142 | 4142 |
                          +------+---------+------------------------+
                            mysql> SET @s = CAST('ab' AS BINARY);
                            mysql> SELECT @s, HEX(@s), HEX(WEIGHT_STRING(@s));
                            +------+---------+------------------------+
                            | @s | HEX(@s) | HEX(WEIGHT_STRING(@s)) |
                            +------+---------+------------------------+
                            | ab | 6162 | 6162 |
                            +------+---------+------------------------+
                            前面的示例使用 HEX() 来显示 WEIGHT_STRING() 结果。因为结果是一个二进制值,所以 HEX() 在结果包含非打印值时特别有用,以可打印形式显示:
                             
                              mysql> SET @s = CONVERT(X'C39F' USING utf8) COLLATE utf8_czech_ci;
                              mysql> SELECT HEX(WEIGHT_STRING(@s));
                              +------------------------+
                              | HEX(WEIGHT_STRING(@s)) |
                              +------------------------+
                              | 0FEA0FEA |
                              +------------------------+
                               
                              对于非 NULL 返回值,如果值的长度在 VARBINARY 的最大长度内,则该值的数据类型为 VARBINARY,否则该数据类型为 BLOB
                               
                              AS 子句可用于将输入字符串强制转换为非二进制或二进制字符串,并将其强制转换为给定长度:
                               
                              ■ AS CHAR(N) 将字符串强制转换为非二进制字符串,并在右侧填充空格,直到总长度为达到 N 个字符长。N 必须至少为 1。如果 N 小于输入字符串的长度,则字符串将被截断为 N 个字符。不会出现截断警告。
                               
                              ■ AS BINARY(N) 类似,但将字符串强制转换为二进制字符串,因此 N 的单位是字节(而不是字符),而填充使用 0x00 字节(而不是空格)。
                               
                                mysql> SET NAMES 'latin1';
                                mysql> SELECT HEX(WEIGHT_STRING('ab' AS CHAR(4)));
                                +-------------------------------------+
                                | HEX(WEIGHT_STRING('ab' AS CHAR(4))) |
                                +-------------------------------------+
                                | 41422020 |
                                +-------------------------------------+
                                mysql> SET NAMES 'utf8';
                                mysql> SELECT HEX(WEIGHT_STRING('ab' AS CHAR(4)));
                                +-------------------------------------+
                                | HEX(WEIGHT_STRING('ab' AS CHAR(4))) |
                                +-------------------------------------+
                                | 0041004200200020 |
                                +-------------------------------------+
                                 
                                  mysql> SELECT HEX(WEIGHT_STRING('ab' AS BINARY(4)));
                                  +---------------------------------------+
                                  | HEX(WEIGHT_STRING('ab' AS BINARY(4))) |
                                  +---------------------------------------+
                                  | 61620000 |
                                  +---------------------------------------+
                                  flags 子句当前未使用。
                                   
                                  如果从 mysql 客户端中调用 WEIGHT_STRING(),则二进制字符串将使用十六进制表示法显示,具体取决于 --binary-as-hex 的值。
                                   
                                   
                                  官方文档:
                                  https://dev.mysql.com/doc/refman/8.0/en/string-functions.html
                                  文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                  评论