MySQL中的字符串函数

使用字符串数据

当使用字符串数据时,可以使用下面的字符数据类型。

  • CHAR
    • 固定长度、不足部分使用空格填充的字符串。
  • varchar
    • 变长字符串。
  • text(MySQL和SQL Server)或CLOB(CHaracter Large Object;Oracle Database)
    • 容纳大长度的边长字符串(通常在上下文中指代文本)。MySQL具有多种text类型(tinytext、text、mediumtext和longtext),最多可保存4GB大小的文档数据。

创建下表用于演示:

CREATE TABLE string_tbl 
(
    char_fld    CHAR(30),
    vchar_fld   VARCHAR(30),
    text_fld    TEXT
);

生成字符串

生成字符串数据的最简单方式是使用一对单引号将字符串包含起来:

INSERT INTO string_tbl (char_fld, vchar_fld, text_fld)
VALUES ('This is char data', 'This is varchar data', 'This is text data');

通过

SELECT @@session.sql_mode;

命令可以查看MySQL命令的模式。
结果如下:

mysql> SELECT @@session.sql_mode;
+----------------------------------------------------------------+
| @@session.sql_mode                                             |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+
1 row in set (0.00 sec)

在MySQL中,默认行为是“strict”模式,即在发生问题时抛出异常,而在早先的服务器版本中,默认方式是阶段字符串并发出一个警告。如果希望数据库引擎采取后一种方式,可以将之修改为ANSI模式:

SET sql_mode='ansi';

通过

SHOW WARNINGS;

来查看警告。

处理字符串中包含单引号的情况

如果要插入的字符串中包含单引号,可以:

  • 通过在单引号前再添加一个单引号作为转义符
  • 或选择反斜杠作为单引号的转义字符
mysql> UPDATE string_tbl
    -> SET text_fld = 'This String disn''t work, but it does now';
Query OK, 1 row affected (0.14 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> UPDATE string_tbl
    -> SET text_fld = 'This String disn\'t work, but it does now';
Query OK, 0 rows affected (0.13 sec)
Rows matched: 1  Changed: 0  Warnings: 0

使用内建函数 quote() ,可以将整个字符串包含起来,并为字符串本身的单引号/撇号增加转义符。例:

SELECT quote(text_fld) FROM string_tbl;

结果:

mysql> SELECT quote(text_fld) FROM string_tbl;
+---------------------------------------------+
| quote(text_fld)                             |
+---------------------------------------------+
| 'This String disn\'t work, but it does now' |
+---------------------------------------------+
1 row in set (0.00 sec)

包含特殊字符

内建函数 char() 可用于从ASCII字符集中255个字符中任意构建字符串:

SELECT CHAR(128,129,130,131,132,133,134,135,136,137);

结果:

mysql> SELECT CHAR(128,129,130,131,132,133,134,135,136,137);
+-----------------------------------------------+
| CHAR(128,129,130,131,132,133,134,135,136,137) |
+-----------------------------------------------+
| €亗儎厗噲‰                                    |
+-----------------------------------------------+
1 row in set (0.00 sec)

concat() 函数用于连接字符串:

mysql> SELECT CONCAT('zifeiy haha ', CHAR(148), 'n');
+----------------------------------------+
| CONCAT('zifeiy haha ', CHAR(148), 'n') |
+----------------------------------------+
| zifeiy haha 攏                         |
+----------------------------------------+
1 row in set (0.00 sec)

ascii() 函数接受一个字符并返回其序号:

mysql> SELECT ASCII('a');
+------------+
| ASCII('a') |
+------------+
|         97 |
+------------+
1 row in set (0.05 sec)

操作字符串

  • length()函数:返回字符串的字符数
SELECT LENGTH(char_fld) char_length,
	LENGTH(vchar_fld) varchar_length,
	LENGTH(text_fld)	text_length
FROM string_tbl;
  • position()函数:查找字符串中子字符串的位置
SELECT POSITION('zifeiy' IN vchar_fld)
FROM string_tbl;
  • locate()函数:从指定位置开始搜索字符串中的子字符串
SELECT LOCATE('zifeiy', vchar_fld, 5)
FROM string_tbl;
  • strcmp()函数:字符串比较函数
    该函数接受两个字符串作为参数,并返回下面的结果之一:
    • -1,第一个字符串字典序小于第二个字符串字典序
    • 0,两个字符串相等
    • 1,第一个字符串字典序大于第二个字符串
SELECT STRCMP('12345', '12345') 12345_12345,
	STRCMP('abcd', 'xyz') abcd_xyz,
	STRCMP('abcd', 'QRSTUV') abcd_QRSTUV,
	STRCMP('qrstuv', 'QRSTUV') qrstuv_QRSTUV,
	STRCMP('12345', 'xyz') 12345_xyz,
	STRCMP('xyz', 'qrstuv') xyz_qrstuv;

结果:

+-------------+----------+-------------+---------------+-----------+------------+
| 12345_12345 | abcd_xyz | abcd_QRSTUV | qrstuv_QRSTUV | 12345_xyz | xyz_qrstuv |
+-------------+----------+-------------+---------------+-----------+------------+
|           0 |       -1 |          -1 |             0 |        -1 |          1 |
+-------------+----------+-------------+---------------+-----------+------------+
  • 除了strcmp()函数,MySQL还可以在select语句中使用like和regexp操作符来比较字符串
SELECT name, name LIKE '%ns' end_in_ns
FROM department;

SELECT cust_id, cust_type_cd, fed_id,
	fed_id REGEXP '.{3}-.{2}-.{4}' is_ss_no_format
FROM customer;

CONCAT()函数的用法示例:

UPDATE string_tbl 
SET text_fld = CONCAT(text_fld, ', now longer');

SELECT CONCAT(fname, ' ', lname) FROM employee;

insert()函数 ,它接受4个参数:原始字符串、字符串操作的开始位置、需要替换的字符串以及替换字符串。根据第三个值,函数可以选择插入或替换原始字符串中的字符。如果该参数值为0,那么替换字符串将会被插入其中,并且剩余的字符将会向右排放。

SELECT INSERT('zifeiy hello', 9, 0, 'haha');

substring()函数 从指定位置开始提取指定数目的字符:

SELECT SUBSTRING('goodbye zifeiy world', 9, 6);
posted @ 2018-04-13 06:37  zifeiy  阅读(351)  评论(0编辑  收藏  举报