字符串函数

length

获取字节个数(utf-8 一个汉字为3个字节,gbk为2个字节)

SELECT LENGTH('YM');        # 输出:2
SELECT LENGTH('你好YM');   # 输出:8

char_length

获取字符个数,不管汉字还是数字或者是字母都算是一个字符

SELECT LENGTH('YM');        # 输出:2
SELECT LENGTH('你好YM');   # 输出:4

concat

拼接字符串

SELECT CONCAT('你好','YM');   # 输出:你好YM

substr / substring

截取字符串

substr(str,pos) # str:要裁剪的字符串,pos:要截取的长度

substr(str,pos,len) # len:截取几位

# substring同理

SELECT SUBSTR('HelloYM', 1, 5);  # 输出:Hello

replace

替换

SELECT REPLACE('你好YM','你好','Hello');  # 输出:HelloYM

locate

获取字符串第一个出现的位置

SELECT LOCATE('YM','你好YM');  # 输出:3
SELECT LOCATE('Hello','你好YM');  # 输出:0

日期函数

datediff

DATEDIFF(d1,d2):计算两个日期的差值,间隔几天

-- 距今多少天
SELECT datediff('20210101', current_date());

date_add/date_sub

DATE_ADD(date,INTERVAL expr type):日期增加

DATE_SUB(date,INTERVAL expr type):日期减少

-- 指定时间加1秒 2021-01-01 00:00:00
SELECT DATE_ADD('2020-12-31 23:59:59', INTERVAL 1 SECOND);
SELECT "2020-12-31 23:59:59" + INTERVAL 1 SECOND;

str_to_date

STR_TO_DATE(dateStr,format):将字符通过指定的格式转换成日期

-- 输出 2021-04-27
SELECT STR_TO_DATE('04-27 2021','%c-%d %Y');

date_format

DATE_FORMAT(date,format):将日期转换成字符 %Y-%m-%d %H:%i:%s

-- 输出 2021年04月27日
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日');
-- 输出 2021-04-27 15:27:25
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s');

其他日期函数

函数语法

功能说明

CURDATE

当前日期

CURTIME

当前时间

DAYOFWEEK(date)

一星期中的第几天(1~7)

DAYOFMONTH(date)

一个月的第几天(1~31)

DAYOFYEAR(date)

一年的第几天(1~366)

其他函数

inet_aton/inet_ntoa

INET_ATON(IP):把ip转为无符号整型,如IP地址为a.b.c.d,计算方式为a*2563+b*2562+c*256+d

INET_NTOA():INET_ATON的逆向操作,把无符号整型转为ip

-- 输出3232235776
select INET_ATON('192.168.1.0');
-- 输出3232235777
select INET_ATON('192.168.1.1');

-- 输出3232235520
select INET_ATON('192.168.0.0');

应用:版本号处理

假设有以下表结构,需要查询某个版本及之前的数据,可以借助INET_ATON函数进行实现查询。

-- 表结构(示例)
CREATE TABLE `T_VERSION_DATA`  (
  `ID` varchar(32) NOT NULL,
  `VERSION` varchar(50) NOT NULL COMMENT '版本号,格式为1.0.0',
  `VERSION_DATA` text COMMENT '版本内容',
  PRIMARY KEY (`ID`)
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

-- 表数据(示例)
INSERT INTO `T_VERSION_DATA` (`ID`, `VERSION`, `VERSION_DATA`) VALUES ('1', '1.0.0', '1.0.0Data');
INSERT INTO `T_VERSION_DATA` (`ID`, `VERSION`, `VERSION_DATA`) VALUES ('2', '1.0.1', '1.0.1Data');
INSERT INTO `T_VERSION_DATA` (`ID`, `VERSION`, `VERSION_DATA`) VALUES ('3', '1.1.0', '1.1.0Data');
INSERT INTO `T_VERSION_DATA` (`ID`, `VERSION`, `VERSION_DATA`) VALUES ('4', '1.1.1', '1.1.1Data');
INSERT INTO `T_VERSION_DATA` (`ID`, `VERSION`, `VERSION_DATA`) VALUES ('5', '1.10.1', '1.10.1Data');
INSERT INTO `T_VERSION_DATA` (`ID`, `VERSION`, `VERSION_DATA`) VALUES ('6', '1.2.1', '1.2.1Data');
INSERT INTO `T_VERSION_DATA` (`ID`, `VERSION`, `VERSION_DATA`) VALUES ('7', '2.0.0', '2.0.0Data');

-- 查询语句
select * FROM (
	SELECT *,INET_ATON(VERSION) AS ver FROM T_VERSION_DATA
) a  WHERE ver <= INET_ATON('1.10.1') ORDER BY ver DESC;