字符串函数
M-Compatibility提供字符串函数对字符串进行处理。
- 对于对字符串位置进行操作的函数,第一个位置的编号为1。
- 对于使用了长度作为参数的函数,非整数的参数将四舍五入到最接近的整数。
- 如果数据库字符集是SQL_ASCII,数据库将把字节值0~127根据ASCII标准解释,而字节值128~255则当作无法解析的字符。如果设置为SQL_ASCII,数据库将无法转换或者校验非ASCII字符,导致CHAR_LENGTH、FIND_IN_SET、LEFT、LOWER、REVERSE、RIGHT、STRCMP及TRIM等字符串函数产生未预期的结果。如果使用了任意非ASCII数据,都不建议将数据库的字符集设置为SQL_ASCII。
ASCII
ASCII(str)
描述:返回字符串str最左侧字符的ASCII码值,str为空字符串时返回0,str为NULL时返回NULL。
返回值类型:INT
示例:
m_db=# SELECT ASCII('');
ascii
-------
0
(1 row)
m_db=# SELECT ASCII('abc');
ascii
-------
97
(1 row)
m_db=# SELECT ASCII(NULL);
ascii
-------
(1 row)
BIT_LENGTH
BIT_LENGTH(str)
描述:返回字符串str的比特位长度。
返回值类型:BIGINT
示例:
m_db=# SELECT BIT_LENGTH('text');
bit_length
------------
32
(1 row)
CHAR_LENGTH
CHAR_LENGTH(str)
描述:返回字符串str包含的字符数,多字节的字符会被计为1个字符。例如,输入2个2字节的字符,LENGTH()返回4,而CHAR_LENGTH()返回2。
返回值类型:BIGINT
示例:
m_db=# SELECT CHAR_LENGTH('text');
char_length
-------------
4
(1 row)
CHARACTER_LENGTH
CHARACTER_LENGTH(str)
描述:与CHAR_LENGTH功能、用法相同。
返回值类型:BIGINT
示例:
m_db=# SELECT CHARACTER_LENGTH('text');
character_length
------------------
4
(1 row)
CONCAT
CONCAT(str1, str2, ..., strN)
描述:按入参顺序将N个字符串拼接并返回拼接后的字符串。如果有一个字符串为NULL,则返回NULL。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT CONCAT('hello', 'world', '!');
concat
-------------
helloworld!
(1 row)
m_db=# SELECT CONCAT('hello', NULL, '!');
concat
--------
(1 row)
CONCAT_WS
CONCAT_WS(separator, str1, str2, ..., strN)
描述:把N个字符串按顺序进行拼接,相邻字符串使用separator进行分割。当separator为NULL时,返回NULL。当待拼接的字符串为NULL时,则忽略NULL。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT CONCAT_WS(',', 'hello', NULL, 'world', '!');
concat_ws
---------------
hello,world,!
(1 row)
m_db=# SELECT CONCAT_WS(NULL, 'hello', NULL, 'world', '!');
concat_ws
-----------
(1 row)
FIELD
FIELD(str, str1, str2, str3, ...)
描述:field函数返回str在{str, str1, str2, str3, ...}列表中的位置。从1开始递增,返回0表示str不在{str, str1, str2, str3, ...}列表中。
- 如果str为NULL或者不在{str, str1, str2, str3, ...}列表时,直接返回0。
- 函数入参全部为数字时,按照数字进行比较;入参全部为非数字类型时,按照字符串进行比较;入参存在数字和非数字混合时,按照DOUBLE类型进行比较。
示例:
m_db=# SELECT FIELD(1,2,1);
field
------
2
(1 row)
m_db=# SELECT FIELD('a','b','a');
field
------
2
(1 row)
m_db=# SELECT FIELD('a',1,'b','a');
WARNING: Truncated incorrect double value: 'a'
CONTEXT: referenced column: field
WARNING: Truncated incorrect double value: 'b'
CONTEXT: referenced column: field
field
-------
2
(1 row)
FIND_IN_SET
FIND_IN_SET(str, strlist)
描述:返回字符串str在字符串列表strlist中的位置,从1开始递增。字符串列表strlist是1个包含若干个子字符串的字符串,各个子字符串之间使用逗号,进行分隔。
- 如果strlist中不包含str,返回0。
- 如果str或strlist为NULL,则返回NULL。
- 如果str中包含逗号,则返回0。
示例:
m_db=# SELECT FIND_IN_SET('e', 'a,b,c;d,e');
find_in_set
-------------
4
(1 row)
m_db=# SELECT FIND_IN_SET('a,', 'a,b,c;d,e');
find_in_set
-------------
0
(1 row)
m_db=# SELECT FIND_IN_SET(NULL, 'a,b,c;d,e');
find_in_set
-------------
(1 row)
HEX
- HEX(str)
描述:将字符串str转换为十六进制字符串,str中的每个字符的每个字节都转换为两个十六进制数字,其逆运算为UNHEX。
返回值类型:TEXT
示例:
m_db=# SELECT HEX('abc'), UNHEX(HEX('abc')); hex | unhex --------+------- 616263 | abc (1 row) - HEX(N)
返回值类型:TEXT
示例:
m_db=# SELECT HEX(255); hex ----- FF (1 row)
LCASE
LCASE(str)
描述:将字符串中的大写字符转换为小写字母。LCASE与LOWER功能、用法一致。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT LCASE('Hello,world!');
lcase
--------------
hello,world!
(1 row)
LEFT
LEFT(str, len)
描述:返回字符串str最左侧的len个字符,如果str或len为NULL,返回NULL。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT LEFT('abcdef', 3);
left
------
abc
(1 row)
m_db=# SELECT LEFT('abcdef', NULL);
left
------
(1 row)
m_db=# SELECT LEFT('abcdef', 11);
left
--------
abcdef
(1 row)
LENGTH
LENGTH(str)
描述:返回字符串str包含的字节数,多字节的字符会被计为多个字节。例如,输入2个2字节的字符,LENGTH()返回4,而CHAR_LENGTH()返回2。
返回值类型:BIGINT
示例:
m_db=# SELECT LENGTH('text');
char_length
-------------
4
(1 row)
LOWER
LOWER(str)
描述:将字符串中的大写字母转换为小写字母。LOWER的功能、用法和LCASE一致。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT LOWER('Hello,world!');
lower
--------------
hello,world!
(1 row)
LPAD
LPAD(str, len, padstr)
描述:使用字符串padstr从左侧填充字符串str,直到长度为len。返回值的长度受GUC参数max_allowed_packet的影响,最大取值为Min(max_allowed_packet/函数返回值字符集单字符最大长度, 1073741819)。
参数:具体说明如表1所示。
返回值类型:TEXT/LONGBLOB
- 如果str长度大于len,则返回str左侧的len个字符。
- 如果str、len、padstr中有一个为NULL,则返回NULL。
- 如果len为负数,则返回NULL。
示例:
m_db=# SELECT LPAD('hello', 10, 'abc');
lpad
------------
abcabhello
(1 row)
m_db=# SELECT LPAD('hello', 3, 'abc');
lpad
------
hel
(1 row)
m_db=# SELECT LPAD('hello', 10, NULL);
lpad
------
(1 row)
m_db=# SELECT LPAD('hello', -10, 'abc');
lpad
------
(1 row)
LTRIM
LTRIM(str)
描述:删除字符串str左侧的空格。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT LTRIM(' hello ');
ltrim
----------
hello
(1 row)
REPEAT
REPEAT(str, count)
描述:返回字符串str重复count次组成的字符串。如果count小于等于0,返回NULL。如果str或者count为NULL,返回NULL。返回值的长度受GUC参数max_allowed_packet的影响,最大取值为Min(max_allowed_packet, 1073741819)。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT REPEAT('abc', 3);
repeat
-----------
abcabcabc
(1 row)
m_db=# SELECT REPEAT('abc', NULL);
repeat
--------
(1 row)
m_db=# SELECT REPEAT('abc', -1);
repeat
--------
(1 row)
REPLACE
REPLACE(str, from_str, to_str)
描述:使用字符串to_str替换字符串str中的字符串from_str,替换时区分大小写。当有任意一个参数为NULL时,返回NULL。返回值的长度受GUC参数max_allowed_packet的影响,最大取值为Min(max_allowed_packet, 1073741819)。
参数:具体说明如表2所示。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT REPLACE('abc,efg,hijk,abcde,dabc,e', 'abc', 'xyz');
replace
---------------------------
xyz,efg,hijk,xyzde,dxyz,e
(1 row)
m_db=# SELECT REPLACE('abc,efg,hijk,abcde,dabc,e', NULL, 'xyz');
replace
---------
(1 row)
REVERSE
REVERSE(str)
描述:返回字符串str的倒序排列。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT REVERSE('abcd');
reverse
---------
dcba
(1 row)
RIGHT
RIGHT(str, len)
描述:返回字符串str最右边len个字符,如果str或len为NULL,则返回NULL。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT RIGHT('abcdef', 4);
right
-------
cdef
(1 row)
m_db=# SELECT RIGHT('abcdef', NULL);
right
-------
(1 row)
RPAD
RPAD(str, len, padstr)
描述:使用字符串padstr从右侧填充字符串str,直到长度为len。返回值的长度受GUC参数max_allowed_packet的影响,最大取值为Min(max_allowed_packet/函数返回值字符集单字符最大长度, 1073741819)。
参数:具体说明如表3所示。
返回值类型:TEXT/LONGBLOB
- 如果str长度大于len,则返回str左侧的len个字符。
- 如果str、len、padstr中有一个为NULL,则返回NULL。
- 如果len为负数,则返回NULL。
示例:
m_db=# SELECT RPAD('hello', 10, 'abc');
rpad
------------
helloabcab
(1 row)
m_db=# SELECT RPAD('hello', 3, 'abc');
rpad
------
hel
(1 row)
m_db=# SELECT RPAD('hello', 10, NULL);
rpad
------
(1 row)
m_db=# SELECT RPAD('hello', -10, 'abc');
rpad
------
(1 row)
RTRIM
RTRIM(str)
描述:删除字符串str右侧的空格。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT RTRIM(' hello ');
rtrim
---------
hello
(1 row)
SPACE
SPACE(N)
描述:返回由N个空格组成的字符串,如果N小于等于0,返回空字符串。返回值的长度受GUC参数max_allowed_packet的影响,最大取值为Min(max_allowed_packet, 1073741819)。
返回值类型:TEXT
示例:
m_db=# SELECT CONCAT('a', SPACE(6), 'b');
concat
----------
a b
(1 row)
m_db=# SELECT CONCAT('a', SPACE(-1), 'b');
concat
--------
ab
(1 row)
STRCMP
STRCMP(str1, str2)
描述:比较str1与str2是否相同。
返回值类型:INT
- 如果 str1 等于 str2, STRCMP函数将返回 0。
- 如果 str1 小于 str2, STRCMP函数将返回 -1。
- 如果 str1 大于 str2, STRCMP函数将返回 1。
- 当任意个参数为 NULL 时, STRCMP函数将返回NULL。
示例:
m_db=# SELECT STRCMP('abc', 'abc');
strcmp
--------
0
(1 row)
m_db=# SELECT STRCMP('abc1', 'abc');
strcmp
--------
1
(1 row)
m_db=# SELECT STRCMP('abc', 'abc1');
strcmp
--------
-1
(1 row)
m_db=# SELECT STRCMP('abc1', 'abc2');
strcmp
--------
-1
(1 row)
m_db=# SELECT STRCMP('abc1', NULL);
strcmp
--------
(1 row)
SUBSTR
SUBSTR函数有以下四种原型,各原型中str、pos以及len的含义一致。
- SUBSTR(str, pos)
- SUBSTR(str FROM pos)
- SUBSTR(str, pos, len)
- SUBSTR(str FROM pos FOR len)
- SUBSTR(str FOR len FROM pos)
- SUBSTR(str FOR len)
描述:返回str的子字符串,起始位置为pos,长度为len。不指定len时,返回的子字符串从pos位置开始,一直到str字符串的结尾。
- pos的位置从1开始计数。
- 参数中包含NULL时,返回NULL。
- pos为负数时,从str尾部向头部倒序确定起始位置。
- len小于等于0、pos的位置为0、pos的位置越界时,返回空字符串。
参数:具体说明如表4所示。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT SUBSTR('abcdefg', 2, 3);
substr
--------
bcd
(1 row)
m_db=# SELECT SUBSTR('abcdefg', NULL);
substr
--------
(1 row)
m_db=# SELECT SUBSTR('abcdefg', 2);
substr
--------
bcdefg
(1 row)
m_db=# SELECT SUBSTR('abcdefg', -2, 3);
substr
--------
fg
(1 row)
m_db=# SELECT SUBSTR('abcdefg', -2);
substr
--------
fg
(1 row)
m_db=# SELECT SUBSTR('abcdefg', 0, 3);
substr
--------
(1 row)
SUBSTRING
SUBSTRING函数有以下四种原型,各原型中str、pos以及len的含义一致。
- SUBSTRING(str, pos)
- SUBSTRING(str FROM pos)
- SUBSTRING(str, pos, len)
- SUBSTRING(str FROM pos FOR len)
- SUBSTRING(str FOR len FROM pos)
- SUBSTRING(str FOR len)
描述:SUBSTRING与SUBSTR功能、用法一致。
参数:具体说明如表5所示。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT SUBSTRING('abcdefg', 2, 3);
substring
-----------
bcd
(1 row)
m_db=# SELECT SUBSTRING('abcdefg', NULL);
substring
-----------
(1 row)
m_db=# SELECT SUBSTRING('abcdefg', 2);
substring
-----------
bcdefg
(1 row)
m_db=# SELECT SUBSTRING('abcdefg', -2, 3);
substring
-----------
fg
(1 row)
m_db=# SELECT SUBSTRING('abcdefg', -2);
substring
-----------
fg
(1 row)
m_db=# SELECT SUBSTRING('abcdefg', 0, 3);
substring
-----------
(1 row)
SUBSTRING_INDEX
SUBSTRING_INDEX(str, delim, count)
描述:使用分隔符delim和次数count确定字符串str中最终分隔符的位置,返回分最终隔符左侧(或右侧)的全部字符。匹配分隔符delim时区分大小写。
- 如果count为正数,从字符串的左侧开始计数,直到delim出现了count次,返回最终分隔符左侧的全部字符。
- 如果count为负数,从字符串的右侧开始计数,直到delim出现了|count|次,返回最终分隔符右侧的全部字符。
- 如果任意一个参数为NULL,返回NULL。
- 如果str或delim为空字符串,返回空字符串
- 如果count等于0,返回空字符串。
参数:具体说明如表6所示。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT SUBSTRING_INDEX('abc..def..ghi..jkl....', '..', 3);
substring_index
-----------------
abc..def..ghi
(1 row)
m_db=# SELECT SUBSTRING_INDEX('abc..def..ghi..jkl....', '..', -3);
substring_index
-----------------
jkl....
(1 row)
m_db=# SELECT SUBSTRING_INDEX('abc..def..ghi..jkl....', '..', NULL);
substring_index
-----------------
(1 row)
m_db=# SELECT SUBSTRING_INDEX('abc..def..ghi..jkl....', '..' ,0);
substring_index
-----------------
(1 row)
TRIM
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
描述:删除字符串str中的所有前缀/后缀子字符串remstr,当任意一个参数为NULL时,返回NULL。匹配remstr时区分大小写。
- remstr:默认为空格。
- [BOTH | LEADING | TRAILING]:
- BOTH:删除前缀和后缀;
- LEADING:删除前缀;
- TRAILING:删除后缀;
- 默认为BOTH。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT TRIM(' abc ');
trim
------
abc
(1 row)
m_db=# SELECT TRIM(TRAILING FROM ' abc ');
trim
--------
abc
(1 row)
m_db=# SELECT TRIM(BOTH 'xyz' FROM 'xyzxyabcxyzxy');
trim
------------
xyabcxyzxy
(1 row)
UCASE
UCASE(str)
描述:将字符串中的小写字母转换为大写字母。UCASE的功能、用法和UPPER一致。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT UCASE('Hello,world!');
ucase
--------------
HELLO,WORLD!
(1 row)
UNHEX
UNHEX(str)
描述:将字符串str中的每个字符解释为十六进制数字,将其转换为该数字表示的字节,返回二进制字符串,其逆运算为HEX(str)。str中的字符必须是合法的十六进制数字,如果参数包含任何非法的数字,则返回NULL。
返回值类型:LONGBLOB
示例:
m_db=# SELECT UNHEX(616263), HEX(UNHEX('616263'));
unhex | hex
-------+--------
abc | 616263
(1 row)
UPPER
UPPER(str)
描述:将字符串中的小写字母转换为大写字母。UPPER的功能、用法和UCASE一致。
返回值类型:TEXT/LONGBLOB
示例:
m_db=# SELECT UPPER('Hello,world!');
upper
--------------
HELLO,WORLD!
(1 row)