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。
对于需要长度参数的函数,非整数参数将被四舍五入到最近的整数。
-
返回字符串
str
的左most字符的数字值。如果str
是空字符串,则返回0
。如果str
是NULL
,则返回NULL
。ASCII()
适用于8位字符。mysql> SELECT ASCII('2'); -> 50 mysql> SELECT ASCII(2); -> 50 mysql> SELECT ASCII('dx'); -> 100
请参阅
ORD()
函数。 -
返回长整数
N
的二进制表示形式,其中N
是一个长整数(BIGINT
)。这等同于CONV(
。返回N
,10,2)NULL
如果N
是NULL
。mysql> SELECT BIN(12); -> '1100'
-
返回字符串
str
的长度,以比特为单位。返回NULL
如果str
是NULL
。mysql> SELECT BIT_LENGTH('text'); -> 32
-
CHAR(
N
,... [USINGcharset_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)
-
返回字符串
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
如果str
是NULL
。 -
返回连接参数的字符串。可以有一个或多个参数。如果所有参数都是非二进制字符串,则结果也是非二进制字符串。如果参数中包含任何二进制字符串,则结果是二进制字符串。数字参数将被转换为其等效的非二进制字符串形式。
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
如果N
=1
,str2
如果N
=2
,以此类推。返回NULL
如果N
小于1
,大于参数的数量或NULL
。ELT()
是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'
-
返回
str
在str1
、str2
、str3
、...
列表中的索引(位置)。返回0
如果str
未找到。如果
FIELD()
的所有参数都是字符串,则所有参数将被比较为字符串。如果所有参数都是数字,则将被比较为数字。否则,参数将被比较为双精度。如果
str
是NULL
,则返回值为0
因为NULL
无法与任何值进行等值比较。FIELD()
是ELT()
的补充。mysql> SELECT FIELD('Bb', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff'); -> 2 mysql> SELECT FIELD('Gg', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff'); -> 0
-
返回值在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
-
将数字
X
格式化为类似于'#,###,###.##'
的格式,四舍五入到D
位小数,并将结果作为字符串返回。如果D
为0
,结果没有小数点或小数部分。如果X
或D
为NULL
,函数返回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'
-
从 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”。 -
对于字符串参数
str
,HEX()
将将str
转换为十六进制字符串,每个字节的每个字符都被转换为两个十六进制数字。 (多字节字符因此将变成多于两个数字。) 逆操作是由UNHEX()
函数执行。对于数字参数
N
,HEX()
将将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
-
将将字符串
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'
这个函数是多字节安全的。
-
返回字符串
str
中第一次出现子串substr
的位置。这与LOCATE()
的二参数形式相同,只是参数顺序相反。mysql> SELECT INSTR('foobarbar', 'bar'); -> 4 mysql> SELECT INSTR('xbar', 'foobar'); -> 0
这个函数是多字节安全的,并且在至少一个参数是二进制字符串时是区分大小写的。如果任何参数为
NULL
,则返回NULL
。 -
LCASE()
在视图中使用时将被重写为LOWER()
,以存储视图的定义。 (Bug #12844279) -
从字符串
str
的左侧返回len
个字符,或者如果任何参数为NULL
则返回NULL
。mysql> SELECT LEFT('foobarbar', 5); -> 'fooba'
该函数支持多字节字符。
-
返回字符串
str
的长度,以字节为单位。多字节字符将被视为多个字节。这意味着,对于包含五个 2 字节字符的字符串,LENGTH()
将返回10
,而CHAR_LENGTH()
将返回5
。如果str
为NULL
则返回NULL
。mysql> SELECT LENGTH('text'); -> 4
NoteOpenGIS 空间函数
Length()
在 MySQL 中被命名为ST_Length()
。 -
读取文件并将其内容作为字符串返回。要使用该函数,文件必须位于服务器主机上,您必须指定文件的完整路径名,并且您必须拥有
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
该函数是多字节安全的,并且在至少一个参数是二进制字符串时是大小写敏感的。
-
返回字符串
str
,将所有字符根据当前字符集映射更改为小写,或者NULL
如果str
为NULL
。默认字符集为utf8mb4
。mysql> SELECT LOWER('QUADRATICALLY'); -> 'quadratically'
LOWER()
(和UPPER()
)在应用于二进制字符串(BINARY
,VARBINARY
,BLOB
)时无效。要对二进制字符串进行字母大小写转换,首先将其转换为非二进制字符串,使用适合存储在字符串中的数据的字符集: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_ci
和utf8mb3_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()
。 -
返回字符串
str
,使用字符串padstr
从左侧填充到长度为len
字符。如果str
的长度超过len
,返回值将被截断到len
字符。mysql> SELECT LPAD('hi',4,'??'); -> '??hi' mysql> SELECT LPAD('hi',1,'??'); -> 'h'
返回
NULL
如果任何参数为NULL
。 -
返回字符串
str
,去除前导空格。返回NULL
如果str
是NULL
。mysql> SELECT LTRIM(' barbar'); -> 'barbar'
该函数是多字节安全的。
-
返回一个集合值(一个以
,
字符分隔的字符串),包含对应于bits
中的位的字符串。str1
对应于位0,str2
对应于位1,以此类推。NULL
值在str1
、str2
等中的不被追加到结果中。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'); -> ''
-
返回一个字符串表示
N
的八进制值,其中N
是一个长整数(BIGINT
)数。这等同于CONV(
。返回N
,10,8)NULL
如果N
是NULL
。mysql> SELECT OCT(12); -> '14'
-
OCTET_LENGTH()
是LENGTH()
的同义词。 -
如果字符串
str
的左most字符是一个多字节字符,返回该字符的代码,根据其组成字节的数字值使用以下公式计算:(1st byte code) + (2nd byte code * 256) + (3rd byte code * 256^2) ...
如果左most 字符不是多字节字符,
ORD()
将返回与ASCII()
函数相同的值。该函数返回NULL
如果str
是NULL
。mysql> SELECT ORD('2'); -> 50
-
将字符串转换为可以用作 SQL 语句中的正确转义数据值。字符串返回以单引号括起来,并将每个 backslash (
\
),单引号 ('
), ASCIINUL
, 和 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()。
-
返回一个字符串,该字符串是将字符串
str
重复count
次。如果count
小于 1,则返回一个空字符串。返回NULL
如果str
或count
是NULL
。mysql> SELECT REPEAT('MySQL', 3); -> 'MySQLMySQLMySQL'
-
将字符串
str
中所有出现的字符串from_str
替换为字符串to_str
。REPLACE()
在搜索from_str
时进行区分大小写的匹配。mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww'); -> 'WwWwWw.mysql.com'
该函数是多字节安全的。它返回
NULL
如果其中任何一个参数是NULL
。 -
将字符串
str
的字符顺序反转,或者如果str
为NULL
则返回NULL
.mysql> SELECT REVERSE('abc'); -> 'cba'
该函数是多字节安全的。
-
从字符串
str
的右侧获取len
个字符,或者如果任何参数为NULL
则返回NULL
.mysql> SELECT RIGHT('foobarbar', 4); -> 'rbar'
该函数是多字节安全的。
-
将字符串
str
右对齐到len
个字符,并使用字符串padstr
填充。如果str
的长度超过len
,则返回的字符串将被截断。如果str
、padstr
或len
为NULL
,则函数返回NULL
.mysql> SELECT RPAD('hi',5,'?'); -> 'hi???' mysql> SELECT RPAD('hi',1,'?'); -> 'h'
该函数是多字节安全的。
-
将字符串
str
的尾部空格字符删除。mysql> SELECT RTRIM('barbar '); -> 'barbar'
该函数是多字节安全的,并且如果
str
为NULL
则返回NULL
. -
将字符串
str
转换为soundex字符串,或者如果str
为NULL
则返回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 描述)。不同之处在于原始版本首先删除元音,然后删除重复项,而增强版本首先删除重复项,然后删除元音。
-
-
返回一个由
个空格组成的字符串,如果N
是N
NULL
,则返回NULL
。mysql> SELECT SPACE(6); -> ' '
-
SUBSTR(
、
,str
)pos
SUBSTR(
、
FROMstr
)pos
SUBSTR(
、
,str
,pos
)len
SUBSTR(
FROMstr
FORpos
)len
SUBSTR()
是SUBSTRING()
的同义词。 -
SUBSTRING(
、
,str
)pos
SUBSTRING(
、
FROMstr
)pos
SUBSTRING(
、
,str
,pos
)len
SUBSTRING(
FROMstr
FORpos
)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
。 -
将字符串参数转换为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
,LEADING
或TRAILING
指令,假定BOTH
。remstr
是可选的,如果不指定,则删除空格。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()
在视图中使用将被重写为UPPER()
。 -
对于字符串参数
str
,UNHEX(
将每对字符在参数中解释为十六进制数字,并将其转换为该数字表示的字节。返回值是一个二进制字符串。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
。对于数字参数
N
,UNHEX()
函数不执行HEX()
的逆运算。使用CONV(HEX(
代替。见N
),16,10)HEX()
的描述。如果
UNHEX()
函数在mysql客户端中被调用,二进制字符串将使用十六进制表示法,取决于--binary-as-hex
的值。有关该选项的更多信息,请见Section 6.5.1, “mysql — The MySQL Command-Line Client”。 -
返回字符串
str
,将所有字符更改为大写,根据当前字符集映射。或如果str
是NULL
,则返回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(
=str1
)WEIGHT_STRING(
,则str2
)
(str1
=str2
str1
和str2
被认为是等价的) -
如果
WEIGHT_STRING(
<str1
)WEIGHT_STRING(
,则str2
)
(str1
<str2
str1
在str2
之前排序)
WEIGHT_STRING()
是一个用于内部使用的调试函数。它的行为可能会在 MySQL 版本之间更改。它可以用于测试和调试排序规则,特别是如果您添加了新的排序规则。请查看Section 12.14, “Adding a Collation to a Character Set”。以下是该函数的参数列表。更多详细信息请查看以下讨论。
-
str
: 输入字符串表达式。 -
AS
子句:可选;将输入字符串转换为给定的类型和长度。 -
flags
: 可选;未使用。
输入字符串,
str
,是一个字符串表达式。如果输入是一个非二进制(字符)字符串,如CHAR
、VARCHAR
或TEXT
值,返回值包含字符串的排序权重。如果输入是一个二进制(字节)字符串,如BINARY
、VARBINARY
或BLOB
值,返回值与输入相同(每个字节的权重为字节值)。如果输入是NULL
,WEIGHT_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命令行客户端”。 -