MySQL 字符串函数和运算符–上篇
1、ASCII(str)
返回字符串最左边字符的ASCII数值,如果str为空字符串则返回0, 如果str为NULL串则返回NULL ,ASCII()适用于 8 位字符。
mysql> SELECT ASCII('');
+-----------+
| ASCII('') |
+-----------+
| 0 |
+-----------+
1 row in set (0.00 sec)
mysql> SELECT ASCII(NULL);
+-------------+
| ASCII(NULL) |
+-------------+
| NULL |
+-------------+
1 row in set (0.00 sec)
mysql> SELECT ASCII('abc');
+--------------+
| ASCII('abc') |
+--------------+
| 97 |
+--------------+
1 row in set (0.00 sec)
mysql> SELECT ASCII('Abc');
+--------------+
| ASCII('Abc') |
+--------------+
| 65 |
+--------------+
1 row in set (0.00 sec)
2、BIN(N)
当N的值在在bigint范围内的时候,返回这个数字的二进制,如果N等于null,那么返回null。
mysql> select bin(100);
+----------+
| bin(100) |
+----------+
| 1100100 |
+----------+
1 row in set (0.00 sec)
2^6+2^5+2^2=64+32+4=100
mysql> select bin(null);
+-----------+
| bin(null) |
+-----------+
| NULL |
+-----------+
1 row in set (0.00 sec)
3、BIT_LENGTH(str)
返回字符串的长度( 以bit为单位)。如果str为空字符串则返回0,如果str是 null则返回 NULL。(1字节=8bit)
mysql> SELECT BIT_LENGTH('abcd');
+--------------------+
| BIT_LENGTH('abcd') |
+--------------------+
| 32 |
+--------------------+
1 row in set (0.00 sec)
4*8=32
mysql> SELECT BIT_LENGTH('');
+----------------+
| BIT_LENGTH('') |
+----------------+
| 0 |
+----------------+
1 row in set (0.00 sec)
mysql> SELECT BIT_LENGTH(null);
+------------------+
| BIT_LENGTH(null) |
+------------------+
| NULL |
+------------------+
1 row in set (0.00 sec)
4、CHAR(N,… [USING charset_name])
char函数比较复杂,默认不加USING参数是返回整数N对应的16进制值,
mysql> select char(77);
+--------------------+
| char(77) |
+--------------------+
| 0x4D |
+--------------------+
1 row in set (0.00 sec)
4 * 16^1+ D * 16^0=64+13=77
如果使用USING参数,则返回这个ASCII值
mysql> SELECT CHAR(88 USING utf8mb4);
+------------------------+
| CHAR(88 USING utf8mb4) |
+------------------------+
| X |
+------------------------+
1 row in set (0.00 sec)
mysql> select ascii('X');
+------------+
| ascii('X') |
+------------+
| 88 |
+------------+
1 row in set (0.00 sec)
其他情况,如果是null则返回null,如果是0则返回0x00
mysql> SELECT CHAR(null);
+------------------------+
| CHAR(null) |
+------------------------+
| 0x |
+------------------------+
1 row in set (0.00 sec)
mysql> SELECT CHAR(0);
+------------------+
| CHAR(0) |
+------------------+
| 0x00 |
+------------------+
1 row in set (0.00 sec)
5、CHAR_LENGTH(str)
LENGTH返回的是字节长度,一个汉字等于3个字节,一个字母等于1个字节,空格也算
CHAR_LENGTH返回的是字符长度,一个汉字和一个字母都是1个字符长度,空格也算
mysql> SET @dolphin:='海豚';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT LENGTH(@dolphin), CHAR_LENGTH(@dolphin);
+------------------+-----------------------+
| LENGTH(@dolphin) | CHAR_LENGTH(@dolphin) |
+------------------+-----------------------+
| 6 | 2 |
+------------------+-----------------------+
1 row in set (0.00 sec)
mysql> SET @dolphin:='abc';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT LENGTH(@dolphin), CHAR_LENGTH(@dolphin);
+------------------+-----------------------+
| LENGTH(@dolphin) | CHAR_LENGTH(@dolphin) |
+------------------+-----------------------+
| 3 | 3 |
+------------------+-----------------------+
1 row in set (0.00 sec)
6、CHARACTER_LENGTH(str)
CHARACTER_LENGTH(str) 是CHAR_LENGTH(str)的同义词,两者一样
mysql> SET @dolphin:='海豚';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT LENGTH(@dolphin), CHAR_LENGTH(@dolphin), CHARACTER_LENGTH(@dolphin);
+------------------+-----------------------+----------------------------+
| LENGTH(@dolphin) | CHAR_LENGTH(@dolphin) | CHARACTER_LENGTH(@dolphin) |
+------------------+-----------------------+----------------------------+
| 6 | 2 | 2 |
+------------------+-----------------------+----------------------------+
1 row in set (0.00 sec)
mysql> SET @dolphin:='abc';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT LENGTH(@dolphin), CHAR_LENGTH(@dolphin), CHARACTER_LENGTH(@dolphin);
+------------------+-----------------------+----------------------------+
| LENGTH(@dolphin) | CHAR_LENGTH(@dolphin) | CHARACTER_LENGTH(@dolphin) |
+------------------+-----------------------+----------------------------+
| 3 | 3 | 3 |
+------------------+-----------------------+----------------------------+
1 row in set (0.00 sec)
7、CONCAT(str1,str2,…)
连接多个字符串,有null,则返回null
mysql> SELECT CONCAT('My', null, 'QL');
+--------------------------+
| CONCAT('My', null, 'QL') |
+--------------------------+
| NULL |
+--------------------------+
1 row in set (0.00 sec)
mysql> SELECT CONCAT('My', 'S', 'QL');
+-------------------------+
| CONCAT('My', 'S', 'QL') |
+-------------------------+
| MySQL |
+-------------------------+
1 row in set (0.00 sec)
8、CONCAT_WS(separator,str1,str2,…)
用什么把字符串连接起来,这里separator等于’null’和null是两种情况
mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name');
+----------------------------------------------+
| CONCAT_WS(',','First name',NULL,'Last Name') |
+----------------------------------------------+
| First name,Last Name |
+----------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT CONCAT_WS('null','First name',NULL,'Last Name');
+-------------------------------------------------+
| CONCAT_WS('null','First name',NULL,'Last Name') |
+-------------------------------------------------+
| First namenullLast Name |
+-------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT CONCAT_WS(null,'First name',NULL,'Last Name');
+-----------------------------------------------+
| CONCAT_WS(null,'First name',NULL,'Last Name') |
+-----------------------------------------------+
| NULL |
+-----------------------------------------------+
1 row in set (0.00 sec)
9、ELT(N,str1,str2,str3,…)
返回第N个字符串,如果N为null,则返回null
mysql> SELECT ELT(1, 'Aa', 'Bb', 'Cc', 'Dd');
+--------------------------------+
| ELT(1, 'Aa', 'Bb', 'Cc', 'Dd') |
+--------------------------------+
| Aa |
+--------------------------------+
1 row in set (0.00 sec)
mysql> SELECT ELT(3, 'Aa', 'Bb', 'Cc', 'Dd');
+--------------------------------+
| ELT(3, 'Aa', 'Bb', 'Cc', 'Dd') |
+--------------------------------+
| Cc |
+--------------------------------+
1 row in set (0.00 sec)
mysql> SELECT ELT(null, 'Aa', 'Bb', 'Cc', 'Dd');
+-----------------------------------+
| ELT(null, 'Aa', 'Bb', 'Cc', 'Dd') |
+-----------------------------------+
| NULL |
+-----------------------------------+
1 row in set (0.00 sec)
如果N是小数,则四舍五入
mysql> SELECT ELT(1.4, 'Aa', 'Bb', 'Cc', 'Dd');
+----------------------------------+
| ELT(1.4, 'Aa', 'Bb', 'Cc', 'Dd') |
+----------------------------------+
| Aa |
+----------------------------------+
1 row in set (0.00 sec)
mysql> SELECT ELT(1.8, 'Aa', 'Bb', 'Cc', 'Dd');
+----------------------------------+
| ELT(1.8, 'Aa', 'Bb', 'Cc', 'Dd') |
+----------------------------------+
| Bb |
+----------------------------------+
1 row in set (0.00 sec)
10、EXPORT_SET(bits,on,off[,separator[,number_of_bits]])
今日最难!
首先简化函数为EXPORT_SET(bits, on, off, separator, length)
参数解释:
bits:必需的。一个数字。将 bits 转为二进制并反转后的各个位的值决定 on 还是 off 出现在该位置。
on:必需的。当位值为 1 时使用的字符串。
off:必需的。当位值为 0 时使用的字符串。
separator:可选的。分隔符或者分隔字符串,默认值为 ,。
length:可选的。集合的元素的个数,默认值为 64。
返回值
EXPORT_SET() 函数根据 bits 对应的二进制并反转后的值挑选对应的字符串,并返回一个逗号分隔的字符串集合。
比如
mysql> SELECT EXPORT_SET(12,'A','B','-',20);
+-----------------------------------------+
| EXPORT_SET(12,'A','B','-',20) |
+-----------------------------------------+
| B-B-A-A-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B |
+-----------------------------------------+
1 row in set (0.00 sec)
bits = 12, 12的二进制位 1100, 总长度为 4,所以不用补0(如果不足4位的,需要左边补 0)。然后反转变为 0011。
按 0011中的每位的值使用 on 或者 off:
第一位为 0,则使用 B。
第二位为 0,则使用 B。
第三位为 1,则使用 A。
第四位为 1,则使用 A。
最后将所有的字符串使用分隔符 - 组合起来,即:B-B-A-A。
length长度为20,则0011补位为0011 0000 0000 0000 0000,替换on和off。则为
BBAA BBBB BBBB BBBB BBBB
再用-符号连接,则为
B-B-A-A-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B





