Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  Functions and Operators  /  String Functions and Operators

14.8 字符串函数和运算符

表14.12 字符串函数和运算符

Name Description
ASCII() 返回左侧字符的数字值
BIN() 返回一个包含数字的字符串的二进制表示
BIT_LENGTH() 返回参数的比特长度
CHAR() 返回每个整数的字符
CHAR_LENGTH() 返回参数的字符数
CHARACTER_LENGTH() CHAR_LENGTH()的同义词
CONCAT() 返回连接的字符串
CONCAT_WS() 返回连接字符串
ELT() 返回字符串的索引号
EXPORT_SET() 返回一个字符串,其中每个比特都对应一个字符串
FIELD() 返回参数在后续参数中的索引号
FIND_IN_SET() 返回参数在字符串中的索引号
FORMAT() 返回一个数字,格式化到指定的小数位数
HEX() 返回一个字符串的十六进制表示
INSERT() 在指定位置插入子串
INSTR() 返回子串的第一个出现位置
LCASE() LOWER()的同义词
LEFT() 返回指定字符数的左侧字符串
LENGTH() 返回字符串的字节长度
LIKE 简单模式匹配
LOAD_FILE() 加载指定文件
LOCATE() 返回子串的第一个出现位置
LOWER() 将字符串转换为小写
LPAD() 将字符串左对齐
LTRIM() 删除字符串的左侧空格
MAKE_SET() 返回一个由对应位的bit设置的字符串集
MATCH() 执行全文搜索
MID() 返回从指定位置开始的子串
NOT LIKE 简单模式匹配的否定
NOT REGEXP REGEXP的否定
OCT() 将数字转换为八进制字符串
OCTET_LENGTH() LENGTH()的同义词
ORD() 返回字符串的第一个字符的ASCII码
POSITION() LOCATE()的同义词
QUOTE() 将字符串转换为SQL语句
REGEXP 字符串是否匹配正则表达式
REGEXP_INSTR() 字符串匹配正则表达式的开始索引
REGEXP_LIKE() 字符串是否匹配正则表达式
REGEXP_REPLACE() 将字符串中的子串替换为正则表达式
REGEXP_SUBSTR() 返回匹配正则表达式的子串
REPEAT() 重复字符串指定次数
REPLACE() 将指定的字符串替换为另一个字符串
REVERSE() 反转字符串中的字符
RIGHT() 返回指定的右侧字符
RLIKE 字符串是否匹配正则表达式
RPAD() 将字符串右侧追加指定次数
RTRIM() 删除字符串右侧的空格
SOUNDEX() 返回Soundex字符串
SOUNDS LIKE 比较Soundex
SPACE() 返回指定数量的空格
STRCMP() 比较两个字符串
SUBSTR() 返回指定的子串
SUBSTRING() 返回指定的子串
SUBSTRING_INDEX() 返回字符串中的子串
TRIM() 删除字符串的前后空格
UCASE() UPPER()的同义词
UNHEX() 返回十六进制表示的字符串
UPPER() 将字符串转换为大写
WEIGHT_STRING() 返回字符串的权重字符串

字符串函数返回 NULL,如果结果的长度超过了max_allowed_packet系统变量的值。请参阅第7.1.1节,“配置服务器”

对于操作字符串位置的函数,第一个位置是编号为1。

对于需要长度参数的函数,非整数参数将被四舍五入到最近的整数。

  • ASCII(str)

    返回字符串str的左most字符的数字值。如果str是空字符串,则返回0。如果strNULL,则返回NULLASCII()适用于8位字符。

    mysql> SELECT ASCII('2');
            -> 50
    mysql> SELECT ASCII(2);
            -> 50
    mysql> SELECT ASCII('dx');
            -> 100

    请参阅ORD()函数。

  • BIN(N)

    返回长整数N的二进制表示形式,其中N是一个长整数(BIGINT)。这等同于CONV(N,10,2)。返回NULL如果NNULL

    mysql> SELECT BIN(12);
            -> '1100'
  • BIT_LENGTH(str)

    返回字符串str的长度,以比特为单位。返回NULL如果strNULL

    mysql> SELECT BIT_LENGTH('text');
            -> 32
  • CHAR(N,... [USING charset_name])

    CHAR()将每个参数N解释为整数,并返回由这些整数给定的字符组成的字符串。NULL值将被跳过。

    mysql> SELECT CHAR(77,121,83,81,'76');
    +--------------------------------------------------+
    | CHAR(77,121,83,81,'76')                          |
    +--------------------------------------------------+
    | 0x4D7953514C                                     |
    +--------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT CHAR(77,77.3,'77.3');
    +--------------------------------------------+
    | CHAR(77,77.3,'77.3')                       |
    +--------------------------------------------+
    | 0x4D4D4D                                   |
    +--------------------------------------------+
    1 row in set (0.00 sec)

    默认情况下,CHAR()返回二进制字符串。要生产给定字符集的字符串,请使用可选的USING子句:

    mysql> SELECT CHAR(77,121,83,81,'76' USING utf8mb4);
    +---------------------------------------+
    | CHAR(77,121,83,81,'76' USING utf8mb4) |
    +---------------------------------------+
    | MySQL                                 |
    +---------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT CHAR(77,77.3,'77.3' USING utf8mb4);
    +------------------------------------+
    | CHAR(77,77.3,'77.3' USING utf8mb4) |
    +------------------------------------+
    | MMM                                |
    +------------------------------------+
    1 row in set, 1 warning (0.00 sec)
    
    mysql> SHOW WARNINGS;
    +---------+------+-------------------------------------------+
    | Level   | Code | Message                                   |
    +---------+------+-------------------------------------------+
    | Warning | 1292 | Truncated incorrect INTEGER value: '77.3' |
    +---------+------+-------------------------------------------+
    1 row in set (0.00 sec)

    如果给定了USING,并且结果字符串对于给定的字符集非法,会发出警告。另外,如果启用了严格的SQL模式,来自CHAR()的结果将是NULL

    如果从mysql客户端调用CHAR(),则二进制字符串将以十六进制表示,取决于--binary-as-hex的值。关于该选项的更多信息,请参见第6.5.1节,“mysql — The MySQL Command-Line Client”

    CHAR()的参数大于255将被转换为多个结果字节。例如CHAR(256)等同于CHAR(1,0),而CHAR(256*256)等同于CHAR(1,0,0)

    mysql> SELECT HEX(CHAR(1,0)), HEX(CHAR(256));
    +----------------+----------------+
    | HEX(CHAR(1,0)) | HEX(CHAR(256)) |
    +----------------+----------------+
    | 0100           | 0100           |
    +----------------+----------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT HEX(CHAR(1,0,0)), HEX(CHAR(256*256));
    +------------------+--------------------+
    | HEX(CHAR(1,0,0)) | HEX(CHAR(256*256)) |
    +------------------+--------------------+
    | 010000           | 010000             |
    +------------------+--------------------+
    1 row in set (0.00 sec)
  • CHAR_LENGTH(str)

    返回字符串str的长度,以代码点为单位。多字节字符被视为单个代码点。这意味着,对于包含两个3字节字符的字符串,LENGTH()返回6,而CHAR_LENGTH()返回2,如以下所示:

    mysql> SET @dolphin:='海豚';
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> SELECT LENGTH(@dolphin), CHAR_LENGTH(@dolphin);
    +------------------+-----------------------+
    | LENGTH(@dolphin) | CHAR_LENGTH(@dolphin) |
    +------------------+-----------------------+
    |                6 |                     2 |
    +------------------+-----------------------+
    1 row in set (0.00 sec)

    CHAR_LENGTH()返回NULL如果strNULL

  • CHARACTER_LENGTH(str)

    CHARACTER_LENGTH()CHAR_LENGTH()的同义词。

  • CONCAT(str1,str2,...)

    返回连接参数的字符串。可以有一个或多个参数。如果所有参数都是非二进制字符串,则结果也是非二进制字符串。如果参数中包含任何二进制字符串,则结果是二进制字符串。数字参数将被转换为其等效的非二进制字符串形式。

    CONCAT()返回NULL如果任何参数是NULL

    mysql> SELECT CONCAT('My', 'S', 'QL');
            -> 'MySQL'
    mysql> SELECT CONCAT('My', NULL, 'QL');
            -> NULL
    mysql> SELECT CONCAT(14.3);
            -> '14.3'

    对于quoted字符串,可以通过将字符串相邻连接来进行连接:

    mysql> SELECT 'My' 'S' 'QL';
            -> 'MySQL'

    如果在CONCAT()中调用了mysql客户端,二进制字符串结果将使用十六进制表示法,取决于--binary-as-hex的值。有关该选项的更多信息,请参见第6.5.1节,“mysql — MySQL 命令行客户端”

  • CONCAT_WS(separator,str1,str2,...)

    CONCAT_WS()表示连接字符串的特殊形式,第一个参数是连接符,用于连接其它参数。连接符可以是字符串,可以是其它参数。如果连接符为NULL,结果为NULL

    mysql> SELECT CONCAT_WS(',','First name','Second name','Last Name');
            -> 'First name,Second name,Last Name'
    mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name');
            -> 'First name,Last Name'

    CONCAT_WS()不跳过空字符串,但是它会跳过连接符后的所有NULL值。

  • ELT(N,str1,str2,str3,...)

    ELT()返回第N个字符串列表的元素:str1如果N = 1str2如果N = 2,以此类推。返回NULL如果N小于1,大于参数的数量或NULLELT()FIELD()的补充。

    mysql> SELECT ELT(1, 'Aa', 'Bb', 'Cc', 'Dd');
            -> 'Aa'
    mysql> SELECT ELT(4, 'Aa', 'Bb', 'Cc', 'Dd');
            -> 'Dd'
  • EXPORT_SET(bits,on,off[,separator[,number_of_bits]])

    返回一个字符串,使得每个在值bits中的位都对应一个on字符串,而每个未设置的位对应一个off字符串。从右到左(从低位到高位)检查bits中的位。字符串从左到右添加到结果中,使用separator字符串(默认为逗号字符,)分隔。被检查的位数由number_of_bits指定,缺省为64。如果number_of_bits大于64,则被静默截断到64。如果number_of_bits为-1,则被视为64。

    mysql> SELECT EXPORT_SET(5,'Y','N',',',4);
            -> 'Y,N,Y,N'
    mysql> SELECT EXPORT_SET(6,'1','0',',',10);
            -> '0,1,1,0,0,0,0,0,0,0'
  • FIELD(str,str1,str2,str3,...)

    返回strstr1str2str3...列表中的索引(位置)。返回0如果str未找到。

    如果FIELD()的所有参数都是字符串,则所有参数将被比较为字符串。如果所有参数都是数字,则将被比较为数字。否则,参数将被比较为双精度。

    如果strNULL,则返回值为0因为NULL无法与任何值进行等值比较。FIELD()ELT()的补充。

    mysql> SELECT FIELD('Bb', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff');
            -> 2
    mysql> SELECT FIELD('Gg', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff');
            -> 0
  • FIND_IN_SET(str,strlist)

    返回值在1到N之间,如果字符串str在字符串列表strlist中,其中N是字符串列表中的子串数。字符串列表是一个由逗号字符,分隔的字符串。 如果第一个参数是常量字符串,第二个参数是SET类型的列,则FIND_IN_SET()函数将使用位算术优化。返回0如果str未在strlist中或strlist为空字符串。返回NULL如果任何参数是NULL。这个函数在第一个参数包含逗号字符,时不工作正常。

    mysql> SELECT FIND_IN_SET('b','a,b,c,d');
            -> 2
  • FORMAT(X,D[,locale])

    将数字X格式化为类似于'#,###,###.##'的格式,四舍五入到D位小数,并将结果作为字符串返回。如果D0,结果没有小数点或小数部分。如果XDNULL,函数返回NULL

    可选的第三个参数允许指定用于结果数字的 locale,包括小数点、千位分隔符和分隔符。允许的 locale 值与lc_time_names系统变量的合法值相同(见第12.16节,“MySQL 服务器 locale 支持”)。如果 locale 为NULL或未指定,使用默认 locale'en_US'

    mysql> SELECT FORMAT(12332.123456, 4);
            -> '12,332.1235'
    mysql> SELECT FORMAT(12332.1,4);
            -> '12,332.1000'
    mysql> SELECT FORMAT(12332.2,0);
            -> '12,332'
    mysql> SELECT FORMAT(12332.2,2,'de_DE');
            -> '12.332,20'
  • FROM_BASE64(str)

    从 base64 编码的字符串中解码,返回解码结果作为二进制字符串。如果参数为NULL或不是有效的 base64 字符串,函数返回NULL。见TO_BASE64()的描述,以了解编码和解码规则。

    mysql> SELECT TO_BASE64('abc'), FROM_BASE64(TO_BASE64('abc'));
            -> 'JWJj', 'abc'

    如果从mysql客户端调用FROM_BASE64(),二进制字符串将以十六进制表示。如果想禁用这个行为,可以在启动mysql客户端时将--binary-as-hex的值设置为0。更多关于该选项的信息,请见Section 6.5.1, “mysql — The MySQL Command-Line Client”

  • HEX(str), HEX(N)

    对于字符串参数 strHEX() 将将 str 转换为十六进制字符串,每个字节的每个字符都被转换为两个十六进制数字。 (多字节字符因此将变成多于两个数字。) 逆操作是由UNHEX() 函数执行。

    对于数字参数 NHEX() 将将 N treated as a longlong (BIGINT) 数字的值表示为十六进制字符串。这等同于CONV(N,10,16)。 逆操作是由CONV(HEX(N),16,10) 执行。

    对于 NULL 参数,这个函数将返回 NULL

    mysql> SELECT X'616263', HEX('abc'), UNHEX(HEX('abc'));
            -> 'abc', 616263, 'abc'
    mysql> SELECT HEX(255), CONV(HEX(255),16,10);
            -> 'FF', 255
  • INSERT(str,pos,len,newstr)

    将将字符串 str 中从位置 pos 开始的 len 个字符长的子串替换为字符串 newstr。如果 pos 不在字符串的长度范围内,则返回原始字符串。如果 len 不在子串的长度范围内,则将子串从位置 pos 开始的剩余部分替换为字符串 newstr。如果任何参数为 NULL,则返回 NULL

    mysql> SELECT INSERT('Quadratic', 3, 4, 'What');
            -> 'QuWhattic'
    mysql> SELECT INSERT('Quadratic', -1, 4, 'What');
            -> 'Quadratic'
    mysql> SELECT INSERT('Quadratic', 3, 100, 'What');
            -> 'QuWhat'

    这个函数是多字节安全的。

  • INSTR(str,substr)

    返回字符串 str 中第一次出现子串 substr 的位置。这与LOCATE() 的二参数形式相同,只是参数顺序相反。

    mysql> SELECT INSTR('foobarbar', 'bar');
            -> 4
    mysql> SELECT INSTR('xbar', 'foobar');
            -> 0

    这个函数是多字节安全的,并且在至少一个参数是二进制字符串时是区分大小写的。如果任何参数为 NULL,则返回 NULL

  • LCASE(str)

    LCASE()LOWER() 的同义词。

    LCASE() 在视图中使用时将被重写为 LOWER(),以存储视图的定义。 (Bug #12844279)

  • LEFT(str,len)

    从字符串 str 的左侧返回 len 个字符,或者如果任何参数为 NULL 则返回 NULL

    mysql> SELECT LEFT('foobarbar', 5);
            -> 'fooba'

    该函数支持多字节字符。

  • LENGTH(str)

    返回字符串 str 的长度,以字节为单位。多字节字符将被视为多个字节。这意味着,对于包含五个 2 字节字符的字符串,LENGTH() 将返回 10,而 CHAR_LENGTH() 将返回 5。如果 strNULL 则返回 NULL

    mysql> SELECT LENGTH('text');
            -> 4
    Note

    OpenGIS 空间函数 Length() 在 MySQL 中被命名为 ST_Length()

  • LOAD_FILE(file_name)

    读取文件并将其内容作为字符串返回。要使用该函数,文件必须位于服务器主机上,您必须指定文件的完整路径名,并且您必须拥有 FILE 权限。文件必须可读由服务器,并且其大小不能超过 max_allowed_packet 字节。如果 secure_file_priv 系统变量设置为非空目录名,那么要加载的文件必须位于该目录中。

    如果文件不存在或无法读取,因为前提条件之一不满足,该函数将返回 NULL

    系统变量 character_set_filesystem 控制了将文件名作为字面字符串给出的解释。

    mysql> UPDATE t
                SET blob_col=LOAD_FILE('/tmp/picture')
                WHERE id=1;
  • LOCATE(substr,str), LOCATE(substr,str,pos)

    首先,语法返回子串substr在字符串str中的第一次出现的位置。第二种语法返回子串substr在字符串str中的第一次出现的位置,从位置pos开始。返回0如果substr不在str中。返回NULL如果任何参数为NULL

    mysql> SELECT LOCATE('bar', 'foobarbar');
            -> 4
    mysql> SELECT LOCATE('xbar', 'foobar');
            -> 0
    mysql> SELECT LOCATE('bar', 'foobarbar', 5);
            -> 7

    该函数是多字节安全的,并且在至少一个参数是二进制字符串时是大小写敏感的。

  • LOWER(str)

    返回字符串str,将所有字符根据当前字符集映射更改为小写,或者NULL如果strNULL。默认字符集为utf8mb4

    mysql> SELECT LOWER('QUADRATICALLY');
            -> 'quadratically'

    LOWER()(和UPPER())在应用于二进制字符串(BINARYVARBINARYBLOB)时无效。要对二进制字符串进行字母大小写转换,首先将其转换为非二进制字符串,使用适合存储在字符串中的数据的字符集:

    mysql> SET @str = BINARY 'New York';
    mysql> SELECT LOWER(@str), LOWER(CONVERT(@str USING utf8mb4));
    +-------------+------------------------------------+
    | LOWER(@str) | LOWER(CONVERT(@str USING utf8mb4)) |
    +-------------+------------------------------------+
    | New York    | new york                           |
    +-------------+------------------------------------+

    对于Unicode字符集的排序规则,LOWER()UPPER()根据Unicode排序算法(UCA)版本在排序规则名称中,如果有一个版本,否则根据UCA 4.0.0。例如,utf8mb4_0900_ai_ciutf8mb3_unicode_520_ci根据UCA 9.0.0和5.2.0工作,而utf8mb3_unicode_ci根据UCA 4.0.0工作。见Section 12.10.1,“Unicode Character Sets”

    该函数是多字节安全的。

    LCASE()在视图中使用时将被重写为LOWER()

  • LPAD(str,len,padstr)

    返回字符串str,使用字符串padstr从左侧填充到长度为len字符。如果str的长度超过len,返回值将被截断到len字符。

    mysql> SELECT LPAD('hi',4,'??');
            -> '??hi'
    mysql> SELECT LPAD('hi',1,'??');
            -> 'h'

    返回NULL如果任何参数为NULL

  • LTRIM(str)

    返回字符串str,去除前导空格。返回NULL如果strNULL

    mysql> SELECT LTRIM('  barbar');
            -> 'barbar'

    该函数是多字节安全的。

  • MAKE_SET(bits,str1,str2,...)

    返回一个集合值(一个以,字符分隔的字符串),包含对应于bits中的位的字符串。str1对应于位0,str2对应于位1,以此类推。NULL值在str1str2等中的不被追加到结果中。

    mysql> SELECT MAKE_SET(1,'a','b','c');
            -> 'a'
    mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');
            -> 'hello,world'
    mysql> SELECT MAKE_SET(1 | 4,'hello','nice',NULL,'world');
            -> 'hello'
    mysql> SELECT MAKE_SET(0,'a','b','c');
            -> ''
  • MID(str,pos,len)

    MID(str,pos,len)SUBSTRING(str,pos,len)的同义词。

  • OCT(N)

    返回一个字符串表示N的八进制值,其中N是一个长整数(BIGINT)数。这等同于CONV(N,10,8)。返回NULL如果NNULL

    mysql> SELECT OCT(12);
            -> '14'
  • OCTET_LENGTH(str)

    OCTET_LENGTH()LENGTH()的同义词。

  • ORD(str)

    如果字符串str的左most字符是一个多字节字符,返回该字符的代码,根据其组成字节的数字值使用以下公式计算:

      (1st byte code)
    + (2nd byte code * 256)
    + (3rd byte code * 256^2) ...

    如果左most 字符不是多字节字符,ORD() 将返回与ASCII() 函数相同的值。该函数返回 NULL 如果 strNULL

    mysql> SELECT ORD('2');
            -> 50
  • POSITION(substr IN str)

    POSITION(substr IN str)LOCATE(substr,str) 的同义词。

  • QUOTE(str)

    将字符串转换为可以用作 SQL 语句中的正确转义数据值。字符串返回以单引号括起来,并将每个 backslash (\),单引号 ('), ASCII NUL, 和 Control+Z 之前的 backslash。 如果参数是 NULL, 则返回值是单引号括起来的“NULL”。

    mysql> SELECT QUOTE('Don\'t!');
            -> 'Don\'t!'
    mysql> SELECT QUOTE(NULL);
            -> NULL

    与之相比,请参阅第11.1.1节,“String Literals”中的文字字符串和 C API 的引号规则,以及mysql_real_escape_string_quote()

  • REPEAT(str,count)

    返回一个字符串,该字符串是将字符串 str 重复 count 次。如果 count 小于 1,则返回一个空字符串。返回 NULL 如果 strcountNULL

    mysql> SELECT REPEAT('MySQL', 3);
            -> 'MySQLMySQLMySQL'
  • REPLACE(str,from_str,to_str)

    将字符串 str 中所有出现的字符串 from_str 替换为字符串 to_strREPLACE() 在搜索 from_str 时进行区分大小写的匹配。

    mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
            -> 'WwWwWw.mysql.com'

    该函数是多字节安全的。它返回 NULL 如果其中任何一个参数是 NULL

  • REVERSE(str)

    将字符串str的字符顺序反转,或者如果strNULL则返回NULL.

    mysql> SELECT REVERSE('abc');
            -> 'cba'

    该函数是多字节安全的。

  • RIGHT(str,len)

    从字符串str的右侧获取len个字符,或者如果任何参数为NULL则返回NULL.

    mysql> SELECT RIGHT('foobarbar', 4);
            -> 'rbar'

    该函数是多字节安全的。

  • RPAD(str,len,padstr)

    将字符串str右对齐到len个字符,并使用字符串padstr填充。如果str的长度超过len,则返回的字符串将被截断。如果strpadstrlenNULL,则函数返回NULL.

    mysql> SELECT RPAD('hi',5,'?');
            -> 'hi???'
    mysql> SELECT RPAD('hi',1,'?');
            -> 'h'

    该函数是多字节安全的。

  • RTRIM(str)

    将字符串str的尾部空格字符删除。

    mysql> SELECT RTRIM('barbar   ');
            -> 'barbar'

    该函数是多字节安全的,并且如果strNULL则返回NULL.

  • SOUNDEX(str)

    将字符串str转换为soundex字符串,或者如果strNULL则返回NULL。两个相似的声音字符串应该具有相同的soundex字符串。标准的soundex字符串是四个字符长,但是SOUNDEX()函数返回一个任意长的字符串。您可以使用SUBSTRING()函数来获取标准的soundex字符串。字符串str中的所有非字母字符将被忽略。字符串str中的所有非A-Z字符将被视为元音。

    Important

    使用SOUNDEX()函数时,您应该注意以下限制:

    • 当前实现的目的是在英语语言中工作。其他语言的字符串可能不产生可靠的结果。

    • 该函数不保证在使用多字节字符集,包括utf-8,提供一致的结果。请查看Bug #22638以获取更多信息。

    mysql> SELECT SOUNDEX('Hello');
            -> 'H400'
    mysql> SELECT SOUNDEX('Quadratically');
            -> 'Q36324'
    Note

    该函数实现了原始 Soundex 算法,而不是更流行的增强版本(也由 D. Knuth 描述)。不同之处在于原始版本首先删除元音,然后删除重复项,而增强版本首先删除重复项,然后删除元音。

  • expr1 SOUNDS LIKE expr2

    这与SOUNDEX(expr1) = SOUNDEX(expr2)相同。

  • SPACE(N)

    返回一个由 N 个空格组成的字符串,如果 NNULL,则返回 NULL

    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将返回空字符串。

    对于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'

    这个函数是多字节安全的。它将返回NULL如果任何参数是NULL

    如果len小于1,结果将是空字符串。

  • SUBSTRING_INDEX(str,delim,count)

    从字符串str返回以delim为分隔符的子串。 如果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'

    这个函数是多字节安全的。

    SUBSTRING_INDEX()将返回NULL如果任何参数是NULL

  • TO_BASE64(str)

    将字符串参数转换为base-64编码形式并返回结果为字符字符串,以连接的字符集和排序规则。如果参数不是字符串,它将被转换为字符串,然后进行转换。结果将是NULL如果参数是NULL。base-64编码字符串可以使用FROM_BASE64()函数进行解码。

    mysql> SELECT TO_BASE64('abc'), FROM_BASE64(TO_BASE64('abc'));
            -> 'JWJj', 'abc'

    不同的base-64编码方案存在。这些是TO_BASE64()FROM_BASE64()使用的编码和解码规则:

    • 字母值62的编码为'+'

    • alphabet 值的编码为 '/'

    • 编码输出由4个可打印字符组成。每3个字节的输入数据使用4个字符编码。如果最后一个组是非完整的,它将使用 '=' 字符填充到4个字符。

    • 编码输出中的每76个字符后添加一个换行符,以将长输出分割成多行。

    • 解码器识别并忽略换行符、回车符、制表符和空格。

  • TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str), TRIM([remstr FROM] str)

    将字符串 str 中的所有 remstr 前缀或后缀删除。如果没有指定 BOTH, LEADINGTRAILING 指令,假定 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'

    该函数是多字节安全的。如果任何参数为 NULL,则返回 NULL

  • 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,则结果为 NULL

    mysql> SELECT UNHEX('GG');
    +-------------+
    | UNHEX('GG') |
    +-------------+
    | NULL        |
    +-------------+
    
    mysql> SELECT UNHEX(NULL);
    +-------------+
    | UNHEX(NULL) |
    +-------------+
    | NULL        |
    +-------------+

    在使用UNHEX()函数时,如果参数是BINARY列,可能会出现NULL结果。这是因为在存储时,值会被padding为0x00字节,但在检索时这些字节不会被删除。例如,'41'将被存储到UNHEX()函数中,但检索时将被删除尾部的空格,返回X'41'。相比之下,'41'将被存储到UNHEX()函数中,但检索时将保留尾部的0x00字节,返回'41\0''\0'不是合法的十六进制数字,所以UNHEX()函数将返回NULL

    对于数字参数NUNHEX()函数不执行HEX()的逆运算。使用CONV(HEX(N),16,10)代替。见HEX()的描述。

    如果UNHEX()函数在mysql客户端中被调用,二进制字符串将使用十六进制表示法,取决于--binary-as-hex的值。有关该选项的更多信息,请见Section 6.5.1, “mysql — The MySQL Command-Line Client”

  • UPPER(str)

    返回字符串str,将所有字符更改为大写,根据当前字符集映射。或如果strNULL,则返回NULL。默认字符集为utf8mb4

    mysql> SELECT UPPER('Hej');
            -> 'HEJ'

    请查看LOWER()的描述,以获取与UPPER()相关的信息。这包括了关于如何将二进制字符串(BINARY, VARBINARY, BLOB)的字母大小写转换信息,以及Unicode字符集的大小写折叠信息。

    这个函数是多字节安全的。

    UCASE()在视图中使用时将被重写为UPPER()

  • WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [flags])

    这个函数返回输入字符串的权重字符串。返回值是一个二进制字符串,表示字符串的比较和排序值,如果输入字符串为NULL,则返回NULL。它具有以下属性:

    WEIGHT_STRING()是一个用于内部使用的调试函数。它的行为可能会在 MySQL 版本之间更改。它可以用于测试和调试排序规则,特别是如果您添加了新的排序规则。请查看Section 12.14, “Adding a Collation to a Character Set”

    以下是该函数的参数列表。更多详细信息请查看以下讨论。

    • str: 输入字符串表达式。

    • AS子句:可选;将输入字符串转换为给定的类型和长度。

    • flags: 可选;未使用。

    输入字符串,str,是一个字符串表达式。如果输入是一个非二进制(字符)字符串,如CHARVARCHARTEXT值,返回值包含字符串的排序权重。如果输入是一个二进制(字节)字符串,如BINARYVARBINARYBLOB值,返回值与输入相同(每个字节的权重为字节值)。如果输入是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 utf8mb4) COLLATE utf8mb4_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 'utf8mb4';
    mysql> SELECT HEX(WEIGHT_STRING('ab' AS CHAR(4)));
    +-------------------------------------+
    | HEX(WEIGHT_STRING('ab' AS CHAR(4))) |
    +-------------------------------------+
    | 1C471C60                            |
    +-------------------------------------+
    mysql> SELECT HEX(WEIGHT_STRING('ab' AS BINARY(4)));
    +---------------------------------------+
    | HEX(WEIGHT_STRING('ab' AS BINARY(4))) |
    +---------------------------------------+
    | 61620000                              |
    +---------------------------------------+

    flags子句当前是未使用的。

    如果从WEIGHT_STRING()中调用,使用mysql客户端,二进制字符串将使用十六进制表示法,取决于--binary-as-hex的值。关于该选项的更多信息,请参见第6.5.1节,“mysql — MySQL命令行客户端”