MySQL 提供了豐富的內建函數,涵蓋字符串處理、日期時間運算、數學計算、流程控制、加密壓縮、信息獲取、聚合統計等領域。本文系統整理了常用函數的語法、參數說明及示例,作為開發與調優時的快速參考手冊。
處理文本數據的核心工具,注意 MySQL 字符串位置從 1 開始計算。
| 函數 | 語法/示例 | 說明 |
|---|---|---|
ASCII(str) | SELECT ASCII('A'); -- 65 | 返回最左字符 ASCII 碼 |
ORD(str) | SELECT ORD('中'); | 多字節字符編碼計算 |
CONV(N,from,to) | SELECT CONV('FF',16,10); -- 255 | 進制轉換 (2-36 進制) |
BIN/OCT/HEX(N) | SELECT HEX(255); -- 'FF' | 二/八/十六進制字符串表示 |
CHAR(N,...) | SELECT CHAR(77,121,83,81,76); -- 'MySQL' | 整數轉字符拼接 |
CONCAT(s1,s2...) | SELECT CONCAT('My','SQL'); -- 'MySQL' | 拼接字符串,任一參數為 NULL 則結果為 NULL |
CONCAT_WS(sep,...) | SELECT CONCAT_WS(',','a','b','c'); -- 'a,b,c' | 帶分隔符拼接,自動跳過 NULL |
LENGTH/CHAR_LENGTH | SELECT LENGTH('中文'), CHAR_LENGTH('中文'); -- 6, 2 | 字節長度 vs 字符長度 |
LOCATE/INSTR/POSITION | SELECT LOCATE('bar','foobarbar'); -- 4 | 子串查找,參數順序略有不同 |
SUBSTRING/SUBSTR/MID | SELECT SUBSTRING('Quadratically',5,6); -- 'ratica' | 提取子串,支援負位置從末尾計算 |
SUBSTRING_INDEX | SELECT SUBSTRING_INDEX('www.mysql.com','.',2); -- 'www.mysql' | 按分隔符第 N 次出現截取 |
TRIM/LTRIM/RTRIM | SELECT TRIM(' bar '); -- 'bar' | 去除首尾/左/右空格或指定字符 |
REPLACE(str,from,to) | SELECT REPLACE('www.mysql.com','w','Ww'); | 替換所有匹配子串 |
REVERSE(str) | SELECT REVERSE('abc'); -- 'cba' | 反轉字符串 |
INSERT(str,pos,len,new) | SELECT INSERT('Quadratic',3,4,'What'); -- 'QuWhattic' | 替換指定位置長度的子串 |
UPPER/LOWER/UCASE/LCASE | SELECT UPPER('hello'); -- 'HELLO' | 大小寫轉換 |
FIND_IN_SET(str,list) | SELECT FIND_IN_SET('b','a,b,c,d'); -- 2 | 在逗號分隔列表中查找位置 |
FIELD/ELT | SELECT FIELD('ej','Hej','ej','Heja'); -- 2 | 返回值在列表中的索引 / 返回索引處的值 |
SOUNDEX | SELECT SOUNDEX('Hello'); -- 'H400' | 諧音編碼,模糊匹配輔助 |
SPACE/REPEAT | SELECT REPEAT('MySQL',3); | 生成空格/重復字符串 |
LOAD_FILE/QUOTE | SELECT QUOTE('Don\'t'); -- 'Don\'t' | 讀取服務器文件 / SQL 轉義引用 |
MySQL 日期函數支援豐富的格式化、運算、提取與轉換。
| 分類 | 函數 | 示例/說明 |
|---|---|---|
| 當前時間 | NOW()/SYSDATE()/CURRENT_TIMESTAMP | 當前日期時間 'YYYY-MM-DD HH:MM:SS' |
CURDATE()/CURRENT_DATE | 當前日期 'YYYY-MM-DD' | |
CURTIME()/CURRENT_TIME | 當前時間 'HH:MM:SS' | |
UTC_DATE/TIME/TIMESTAMP | UTC 時間對應值 | |
| 提取組件 | ||
YEAR/MONTH/DAY/HOUR/MINUTE/SECOND | 提取對應部分 | |
DAYOFWEEK/WEEKDAY | 星期索引 (1=周日 / 0=周一) | |
DAYOFMONTH/DAYOFYEAR | 月內天數 / 年內天數 | |
MONTHNAME/DAYNAME | 月份/星期英文名 | |
QUARTER/WEEK/WEEKOFYEAR | 季度/周數 (模式可配置) | |
| 格式化與解析 | ||
DATE_FORMAT(date,fmt) | %Y-%m-%d %H:%i:%s 等豐富佔位符 | |
TIME_FORMAT(time,fmt) | 僅處理時分秒佔位符 | |
STR_TO_DATE(str,fmt) | 字符串按格式解析為 DATE/DATETIME | |
GET_FORMAT(type,locale) | 獲取標準格式字符串 (EUR/USA/JIS/ISO/INTERNAL) | |
| 日期運算 | ||
DATE_ADD/DATE_SUB | DATE_ADD('2023-01-01', INTERVAL 1 DAY) 支援 YEAR/MONTH/DAY/HOUR/MINUTE/SECOND 等複合間隔 | |
ADDDATE/SUBDATE | DATE_ADD/DATE_SUB 別名 | |
ADDTIME/SUBTIME | 時間加減 | |
DATEDIFF/TIMEDIFF | 兩日期/時間差 (天數/時間值) | |
PERIOD_ADD/DIFF | 年月期間加減月數 YYYYMM 格式 | |
LAST_DAY | 該月最後一天日期 | |
MAKEDATE/MAKETIME | 由年/年內天數 或 時分秒構造日期時間 | |
| 時間戳轉換 | ||
UNIX_TIMESTAMP([date]) | 日期轉 Unix 秒數 (從 1970-01-01) | |
FROM_UNIXTIME(sec[,fmt]) | Unix 秒數轉日期字符串 | |
TO_DAYS/FROM_DAYS | 日期轉年份 0 起始天數 / 反向 | |
SEC_TO_TIME/TIME_TO_SEC | 秒數與 HH:MM:SS 互轉 | |
CONVERT_TZ(dt,from,to) | 時區轉換 | |
EXTRACT(unit FROM date) | 提取間隔單元 (同 DATE_ADD 單元) | |
| 函數 | 語法 | 示例 |
|---|---|---|
CASE | CASE val WHEN v1 THEN r1 ... ELSE rn END 或 CASE WHEN cond1 THEN r1 ... END | SELECT CASE 1 WHEN 1 THEN 'one' ELSE 'other' END; |
IF(expr, t, f) | expr 為真 (非 0/NULL) 返回 t,否則 f | SELECT IF(1>0,'yes','no'); |
IFNULL(expr1,expr2) | expr1 非 NULL 返回 expr1,否則 expr2 | SELECT IFNULL(NULL,'default'); |
NULLIF(expr1,expr2) | expr1=expr2 返回 NULL,否則 expr1 | SELECT NULLIF(5,5); -- NULL |
| 函數 | 說明 | 示例 |
|---|---|---|
ABS/CEIL/FLOOR/ROUND/TRUNCATE | 絕對值/向上/向下/四捨五入/截斷取整 | ROUND(1.234,2)=1.23 |
SIGN | 符號 -1/0/1 | |
POW/POWER/SQRT | 冪/平方根 | POW(2,3)=8 |
EXP/LN/LOG/LOG2/LOG10 | 指數/自然對數/對數 | |
SIN/COS/TAN/ASIN/ACOS/ATAN/ATAN2 | 三角/反三角函數 (弧度) | |
DEGREES/RADIANS | 角度弧度互轉 | |
PI | 圓周率 | |
MOD(N,M) / N%M | 取模 | |
RAND([seed]) | 隨機數 0-1,種子固定序列可復現 | |
CRC32 | 循環冗余校驗 32 位無符號 |
| 函數 | 說明 |
|---|---|
MD5/SHA1/SHA2 | 哈希摘要 (MD5 128bit, SHA1 160bit, SHA2 可選 224/256/384/512) |
PASSWORD/OLD_PASSWORD | MySQL 用戶密碼加密 (版本相關,慎用) |
AES_ENCRYPT/DECRYPT | AES 對稱加密 (默認 128bit) |
DES_ENCRYPT/DECRYPT | Triple-DES 加密 |
ENCODE/DECODE | 簡單密碼加密 (非強加密) |
ENCRYPT(str[,salt]) | Unix crypt() 系統調用 |
COMPRESS/UNCOMPRESS | zlib 壓縮/解壓 (需編譯支援) |
UNCOMPRESSED_LENGTH | 壓縮前長度 |
HEX/UNHEX | 十六進制編碼/解碼 |
| 函數 | 用途 |
|---|---|
VERSION() | 服務器版本字符串 |
CONNECTION_ID() | 當前連接線程 ID |
DATABASE()/SCHEMA() | 當前默認數據庫 |
USER()/CURRENT_USER/SESSION_USER/SYSTEM_USER | 當前認證用戶/認證上下文用戶 |
CHARSET/COLLATION/COERCIBILITY | 字符集/排序規則/強制性 |
LAST_INSERT_ID() | 上條 INSERT 自增 ID |
ROW_COUNT() | 上條語句影響行數 |
FOUND_ROWS() | 配合 SQL_CALC_FOUND_ROWS 獲取無 LIMIT 總行數 |
BENCHMARK(count,expr) | 性能測試:重復執行表達式 |
| 函數 | 說明 |
|---|---|
COUNT(expr)/COUNT(DISTINCT ...) | 非 NULL 行數 / 去重計數 |
SUM/AVG | 求和/平均 (支援 DISTINCT) |
MIN/MAX | 最小/最大值 (字符串按字典序) |
GROUP_CONCAT | 分組拼接 GROUP_CONCAT(DISTINCT col ORDER BY col SEPARATOR ',') |
STD/STDDEV/STDDEV_POP/STDDEV_SAMP | 總體/樣本標準差 |
VAR_POP/VAR_SAMP/VARIANCE | 總體/樣本方差 |
BIT_AND/BIT_OR/BIT_XOR | 位運算聚合 (64bit 精度) |
DEFAULT(col):獲取列默認值FORMAT(X,D):數字格式化 #,###.##INET_ATON/NTOA:IP 地址與整數互轉GET_LOCK/RELEASE_LOCK/IS_FREE_LOCK/IS_USED_LOCK:用戶級命名鎖UUID():生成全局唯一標識符 (RFC 4122)VALUES(col):INSERT ... ON DUPLICATE KEY UPDATE 中引用插入值SLEEP(duration):休眠秒數 (可微秒)MASTER_POS_WAIT(log,pos[,timeout]):主從同步等待NAME_CONST(name,val):結果集列命名MATCH(col1,col2...) AGAINST(expr [IN BOOLEAN MODE | WITH QUERY EXPANSION])
需在 MyISAM 或 InnoDB (5.6+) 表上建立 FULLTEXT 索引。
utf8mb4,避免亂碼與截斷。WHERE varchar_col = 123 會導致全表掃描,應寫 '123'。WHERE dt > DATE_SUB(NOW(), INTERVAL 7 DAY) 可用索引,WHERE TO_DAYS(NOW()) - TO_DAYS(dt) < 7 則不可。