字符串是数据处理中最常见的数据类型之一,从存储用户姓名、地址到处理文本内容、日志信息,字符串数据贯穿于各种业务场景,mysql提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析。本文我将全面且深入地介绍mysql常用的字符串函数,并结合具体示例和场景,帮你熟练掌握这些实用工具。
一、字符串函数概述
1.1 字符串函数的作用
mysql字符串函数能够实现对字符串的多种操作,包括但不限于:
- 字符串的拼接、截取、替换
- 大小写转换、去空格
- 字符串查找、匹配与统计
- 字符串格式化与加密
这些函数极大地增强了sql语句对字符串数据的处理能力,使开发者可以在数据库层面完成复杂的字符串操作,减少应用层的处理压力。
1.2 字符串函数分类
根据功能特性,mysql字符串函数可大致分为以下几类:
- 字符串长度与统计函数
- 字符串截取与提取函数
- 字符串连接与拆分函数
- 字符串查找与匹配函数
- 字符串转换与格式化函数
- 字符串加密与解密函数
二、字符串长度与统计函数
2.1 char_length(str)
char_length(str)
函数用于返回字符串str
的字符数,一个汉字、字母、数字等都算作一个字符。
示例:查询employees
表中last_name
字段的字符长度
select last_name, char_length(last_name) as length from employees;
2.2 length(str)
length(str)
函数返回字符串str
的字节长度。在utf8编码下,一个英文字母占1个字节,一个汉字占3个字节。
示例:查询products
表中product_name
字段的字节长度
select product_name, length(product_name) as byte_length from products;
2.3 octet_length(str)
octet_length(str)
与length(str)
功能相同,都是返回字符串的字节长度。
select octet_length('hello, 世界') as octet_length;
三、字符串截取与提取函数
3.1 substring(str, pos)、substring(str, pos, len)
substring(str, pos)
从字符串str
的第pos
个位置开始截取,直到字符串结尾;substring(str, pos, len)
从第pos
个位置开始截取长度为len
的子字符串。
示例:从customers
表的phone_number
字段中提取后4位号码
select phone_number, substring(phone_number, -4) as last_four_digits from customers;
3.2 left(str, len)、right(str, len)
left(str, len)
返回字符串str
最左边len
个字符,right(str, len)
返回最右边len
个字符。
示例:获取orders
表中order_number
字段的前3位和后3位
select order_number, left(order_number, 3) as first_three_digits, right(order_number, 3) as last_three_digits from orders;
3.3 mid(str, pos, len)
mid(str, pos, len)
与substring(str, pos, len)
功能一致,从字符串str
的第pos
个位置开始截取长度为len
的子字符串。
select mid('mysql字符串函数', 4, 6) as extracted_substring;
四、字符串连接与拆分函数
4.1 concat(str1, str2, …)
concat(str1, str2, ...)
用于将多个字符串连接成一个字符串。
示例:将employees
表中的first_name
和last_name
连接成完整姓名
select concat(first_name,'', last_name) as full_name from employees;
4.2 concat_ws(separator, str1, str2, …)
concat_ws(separator, str1, str2, ...)
使用指定的分隔符separator
连接多个字符串,遇到null
值时会跳过,不会返回null
。
示例:用逗号连接products
表中的product_name
和category
字段
select concat_ws(', ', product_name, category) as product_info from products;
4.3 group_concat(expr)
group_concat(expr)
将分组后的结果集中的expr
列值连接成一个字符串,默认用逗号分隔。
示例:查询每个department
的所有employee_name
select department, group_concat(employee_name) as employees from employees group by department;
五、字符串查找与匹配函数
5.1 instr(str, substr)
instr(str, substr)
返回子字符串substr
在字符串str
中第一次出现的位置,不存在则返回0。
示例:在customers
表的email
字段中查找@
符号的位置
select email, instr(email, '@') as at_position from customers;
5.2 locate(substr, str)、position(substr in str)
这两个函数与instr(str, substr)
功能相同,都是返回子字符串在字符串中首次出现的位置。
select locate('world', 'hello, world!') as locate_result, position('world' in 'hello, world!') as position_result;
5.3 like、not like
like
用于模糊匹配,配合通配符%
(匹配任意字符序列)和_
(匹配单个字符)使用;not like
则是取反。
示例:查询customers
表中姓名以“张”开头的客户
select * from customers where customer_name like '张%';
5.4 regexp、not regexp
regexp
支持正则表达式匹配,not regexp
为取反。
示例:查询products
表中product_name
包含数字的产品
select product_name from products where product_name regexp '[0-9]';
六、字符串转换与格式化函数
6.1 upper(str)、lower(str)
upper(str)
将字符串转换为大写,lower(str)
转换为小写。
示例:将employees
表中的email
字段统一转换为小写
select lower(email) as lower_email from employees;
6.2 trim([{both | leading | trailing} [remstr] from] str)
trim()
用于去除字符串两端的空格或指定字符,leading
去除开头,trailing
去除结尾,both
(默认)去除两端。
示例:去除customers
表中address
字段两端的空格
select trim(address) as trimmed_address from customers;
6.3 lpad(str, len, padstr)、rpad(str, len, padstr)
lpad(str, len, padstr)
在字符串str
左侧填充padstr
,使其长度达到len
;rpad(str, len, padstr)
在右侧填充。
示例:将orders
表中的order_id
填充为8位,左侧补0
select lpad(order_id, 8, '0') as padded_order_id from orders;
七、字符串加密与解密函数
7.1 md5(str)
md5(str)
计算字符串str
的md5哈希值,常用于密码加密(但安全性较低,不建议用于敏感数据)。
select md5('password') as md5_hash;
7.2 sha(str)、sha2(str, hash_length)
sha(str)
计算字符串的sha-1哈希值,sha2(str, hash_length)
计算sha-2系列哈希值,hash_length
可选224、256、384、512。
select sha('data'), sha2('data', 256) as sha2_256_hash;
八、实战案例
8.1 日志分析
在日志表logs
中,字段log_message
记录了操作信息,需求是提取其中的操作类型(以[
开头,]
结尾的部分)。
select substring(log_message, instr(log_message, '[') + 1, instr(log_message, ']') - instr(log_message, '[') - 1) as operation_type from logs;
8.2 用户数据清洗
对users
表中的phone_number
字段进行处理,去除非数字字符,并统一格式为xxx-xxxx-xxxx
。
select concat( left(trim(regexp_replace(phone_number, '[^0-9]', '')), 3), '-', mid(trim(regexp_replace(phone_number, '[^0-9]', '')), 4, 4), '-', right(trim(regexp_replace(phone_number, '[^0-9]', '')), 4) ) as formatted_phone_number from users;
到此这篇关于mysql常用字符串函数示例和场景介绍的文章就介绍到这了,更多相关mysql字符串函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论