前言:不背誦,會查閱,知邊界
MySQL 提供 200+ 內置函數,涵蓋字符串處理、日期時間運算、數學計算、加密安全、聚合統計、元信息查詢等領域。本文按**功能分類**整理核心函數簽名、參數說明、典型示例與避坑提示,作為開發調試時的「隨身速查表」。
一、字符串函數(高頻 TOP 20)
| 函數 | 作用 | 關鍵行為/陷阱 | 示例 |
CONCAT(s1,s2...) | 拼接字符串 | **任一參數為 NULL 結果為 NULL** | CONCAT('My','SQL') → 'MySQL' |
CONCAT_WS(sep,s1,s2...) | 帶分隔符拼接 | **自動跳過 NULL**,不產生多餘分隔符 | CONCAT_WS(',', 'a', NULL, 'c') → 'a,c' |
LENGTH(str) | 字節長度 | 多字節字符按字節計 | LENGTH('中') → 3 (utf8mb4) |
CHAR_LENGTH(str) | 字符長度 | 多字節字符計 1 | CHAR_LENGTH('中') → 1 |
SUBSTRING(str,pos,len) | 截取子串 | pos 從 1 起;支援負數倒數 | SUBSTRING('abcde', 2, 3) → 'bcd' |
SUBSTRING_INDEX(str,delim,count) | 按分隔符截取 | count>0 取左,<0 取右 | SUBSTRING_INDEX('a.b.c', '.', 2) → 'a.b' |
TRIM([BOTH|LEADING|TRAILING] [rem] FROM str) | 去除首尾字符 | 默認去空格,rem 可指定字符集 | TRIM(' x ' ) → 'x' |
REPLACE(str,from,to) | 替換所有匹配 | 區分大小寫 | REPLACE('abc', 'b', 'X') → 'aXc' |
LOCATE(sub,str[,pos]) | 查找子串位置 | 不存在返回 0;pos 指定起始位置 | LOCATE('bar', 'foobarbar') → 4 |
LOWER/UPPER(str) | 大小寫轉換 | 受字符集影響 | UPPER('mysql') → 'MYSQL' |
LPAD/RPAD(str,len,pad) | 左/右填充 | 超長截斷 | LPAD('1', 5, '0') → '00001' |
REVERSE(str) | 反轉字符串 | | REVERSE('abc') → 'cba' |
INSERT(str,pos,len,newstr) | 替換指定區間 | pos 從 1 起 | INSERT('Quadratic', 3, 4, 'What') → 'QuWhattic' |
FIELD(str,s1,s2...) | 返回 str 在列表中索引 | 找不到返回 0 | FIELD('b', 'a','b','c') → 2 |
FIND_IN_SET(str,strlist) | 集合中查找 | strlist 為逗號分隔字符串 | FIND_IN_SET('b','a,b,c') → 2 |
HEX/UNHEX | 十六進制互轉 | UNHEX 為 HEX 逆操作 | HEX('MySQL') → '4D7953514C' |
SOUNDEX(str) | 聲音編碼 | 英文近似發音匹配 | SOUNDEX('Hello') → 'H400' |
SPACE(N) | 生成 N 空格 | | SPACE(4) → ' ' |
ELT(N, s1, s2...) | 返回第 N 個參數 | N 超出返回 NULL | ELT(2, 'a','b') → 'b' |
MAKE_SET(bits, s1, s2...) | 按位組合字符串 | bits 二進制位對應參數 | MAKE_SET(5,'a','b','c') → 'a,c' |
二、日期時間函數(核心 15+)
| 函數 | 作用 | 示例/備註 |
NOW() / SYSDATE() | 當前日期時間 | NOW() 取語句開始時間,SYSDATE() 取實時時間 |
CURDATE() / CURTIME() | 當前日期/時間 | |
DATE(expr) | 提取日期部分 | DATE('2023-01-01 12:00') → '2023-01-01' |
DATE_FORMAT(date, fmt) | 格式化日期 | %Y年 %m月 %d日 %H時 %i分 %s秒 |
STR_TO_DATE(str, fmt) | 字符串解析為日期 | DATE_FORMAT 逆操作 |
DATE_ADD/DATE_SUB(date, INTERVAL expr unit) | 日期加減 | unit: SECOND/MINUTE/HOUR/DAY/MONTH/YEAR 等 |
DATEDIFF(d1, d2) | 兩日期相差天數 | DATEDIFF('2023-01-03','2023-01-01') → 2 |
TIMESTAMPDIFF(unit, dt1, dt2) | 精確時間差 | unit 可為 MICROSECOND/SECOND/MINUTE 等 |
UNIX_TIMESTAMP([date]) | 轉 Unix 時間戳 | 無參數取當前 |
FROM_UNIXTIME(ts[, fmt]) | 時間戳轉日期 | |
DAYOFWEEK/WEEKDAY(date) | 星期索引 | 前者 1=周日,後者 0=周一 |
LAST_DAY(date) | 月最後一天 | |
QUARTER(date) | 季度 1-4 | |
PERIOD_ADD/PERIOD_DIFF | 年月運算 | 格式 YYYYMM |
SEC_TO_TIME / TIME_TO_SEC | 秒與時間互轉 | |
EXTRACT(unit FROM date) | 提取日期部件 | 同 DATE_ADD 的 unit |
三、數學函數(常用 15)
ABS(x) -- 絕對值
CEIL(x)/FLOOR(x) -- 向上/向下取整
ROUND(x[,d]) -- 四捨五入保留 d 位
TRUNCATE(x,d) -- 截斷保留 d 位(不四捨五入)
MOD(n,m) / n%m -- 取模
POW(x,y) -- x 的 y 次方
SQRT(x) -- 平方根
RAND([seed]) -- 隨機數 0-1,種子固定序列固定
SIN/COS/TAN(x) -- 三角函數(弧度)
ASIN/ACOS/ATAN -- 反三角
ATAN2(y,x) -- 兩參數反正切,定象限
DEGREES/RADIANS -- 角度弧度互轉
LN(x)/LOG(x)/LOG2/LOG10 -- 對數
EXP(x) -- e^x
PI() -- π
CRC32(expr) -- 循環冗餘校驗
四、控制流函數
CASE WHEN cond1 THEN v1 [WHEN cond2 THEN v2...] [ELSE vd] END
CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2...] [ELSE rd] END
IF(cond, true_val, false_val)
IFNULL(v1, v2) -- v1 不為 NULL 返回 v1,否則 v2
NULLIF(v1, v2) -- 相等返回 NULL,否則 v1
五、加密與壓縮函數
| 函數 | 用途 | 備註 |
MD5(str) | 128 位摘要 | 返回 32 位十六進制字符串,不可逆 |
SHA1/SHA2(str, 256|512) | SHA 摘要 | 更安全 |
PASSWORD(str) | MySQL 密碼加密 | 內部用,版本間算法不同,**業務勿用** |
AES_ENCRYPT/DECRYPT(str, key) | AES 對稱加密 | 密鑰長度 128/256 位 |
DES_ENCRYPT/DECRYPT | DES 加密 | 需 SSL 支援 |
ENCODE/DECODE(str, pass) | 簡易加密 | 安全性低,**不推薦生產** |
COMPRESS/UNCOMPRESS(str) | zlib 壓縮/解壓 | 需編譯支援 zlib |
UNCOMPRESSED_LENGTH(str) | 壓縮前長度 | |
六、聚合函數
COUNT(expr) / COUNT(DISTINCT expr)
SUM/AVG/MIN/MAX([DISTINCT] expr)
GROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR ','])
STDDEV_POP/SAMP(expr) -- 總體/樣本標準差
VAR_POP/SAMP(expr) -- 總體/樣本方差
BIT_AND/OR/XOR(expr) -- 位運算聚合
七、信息函數(運維診斷常用)
VERSION() -- 服務器版本
CONNECTION_ID() -- 當前連接 ID (線程 ID)
CURRENT_USER() -- 驗證用戶@主機
USER() / SYSTEM_USER() -- 客戶端發起用戶@主機
DATABASE() / SCHEMA() -- 當前默認數據庫
FOUND_ROWS() -- 配合 SQL_CALC_FOUND_ROWS 獲取無 LIMIT 總行數
ROW_COUNT() -- 影響行數 (INSERT/UPDATE/DELETE)
LAST_INSERT_ID() -- 上條語句生成的 AUTO_INCREMENT 值
BENCHMARK(count, expr) -- 表達式執行 count 次耗時(性能測試)
CHARSET/CHARSET(str) -- 字符集/排序規則
INET_ATON/NTOA(ip) -- IP 地址與整數互轉
GET_LOCK/RELEASE_LOCK/IS_FREE_LOCK/IS_USED_LOCK -- 具名鎖服務
UUID() -- 生成 UUID (RFC 4122)
SLEEP(sec) -- 休眠秒數,可用於測試超時
八、其他實用函數
DEFAULT(col) -- 列默認值(僅 INSERT...ON DUPLICATE KEY UPDATE 中有效)
VALUES(col) -- 同 INSERT...ON DUPLICATE KEY UPDATE 中引用待插值
FORMAT(x, d) -- 數字格式化 '###,###.##' 保留 d 位
MASTER_POS_WAIT(log, pos[, timeout]) -- 主從同步等待工具
避坑提示速查
- CONCAT 遇 NULL 全 NULL → 用
CONCAT_WS 或 COALESCE。
- 日期字符串隱式轉換依賴 sql_mode → 顯式用
STR_TO_DATE。
- ROUND 四捨五入受「銀行家算法」影響(.5 向最近偶數) → 精確金額用
DECIMAL + 應用層處理。
- PASSWORD() 非業務函數 → 用
SHA2 或 BCRYPT(應用層)。
- GROUP_CONCAT 默認 1024 字節截斷 →
SET SESSION group_concat_max_len = 100000;。
結語
函數是 SQL 表達力的延伸。**熟悉分類、掌握核心 20%、知道去哪查文檔**,比死記硬背更高效。建議將本文收藏,遇到「這功能 MySQL 有現成函數嗎?」時,Ctrl+F 一搜即得。