函數是 SQL 表達力的延伸。本文將 MySQL 核心內建函數按業務場景分為四大類,提煉高頻函數簽名、參數說明、返回值特性與實戰範例,打造「查得快、用得對、不踩坑」的桌面級速查手冊。
| 函數 | 說明 | 範例 | 返回示例 |
|---|---|---|---|
NOW() | 當前日期時間(執行開始時刻固定) | SELECT NOW(); | 2023-10-11 14:30:45 |
SYSDATE() | 當前日期時間(實時執行時刻) | SELECT SYSDATE(), SLEEP(2), SYSDATE(); | 前後相差 2 秒 |
CURDATE() | 當前日期 | SELECT CURDATE(); | 2023-10-11 |
CURTIME() | 當前時間 | SELECT CURTIME(); | 14:30:45 |
DATE_FORMAT(d, fmt) | 格式化輸出 | SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); | 2023-10-11 14:30:45 |
DATE_ADD(d, INTERVAL expr unit) | 日期加減運算 | SELECT DATE_ADD(NOW(), INTERVAL 1 DAY); | 翌日同一時間 |
DATEDIFF(d1, d2) | 兩日期相差天數 | SELECT DATEDIFF('2023-10-11', '2023-10-01'); | 10 |
TIMESTAMPDIFF(unit, d1, d2) | 精確間隔(支援 MICROSECOND 等) | SELECT TIMESTAMPDIFF(SECOND, '2023-10-11 10:00:00', NOW()); | 秒數差 |
YEAR/MONTH/DAY/HOUR/MINUTE/SECOND(d) | 提取單一分量 | SELECT MONTH(NOW()); | 10 |
WEEKDAY(d) / DAYOFWEEK(d) | 星期索引(0=週一/1=週日) | SELECT WEEKDAY(NOW()); | 2 (週三) |
LAST_DAY(d) | 所在月最後一天 | SELECT LAST_DAY(NOW()); | 2023-10-31 |
STR_TO_DATE(str, fmt) | 字串解析為日期 | SELECT STR_TO_DATE('20231011', '%Y%m%d'); | 2023-10-11 |
避坑提示:NOW() 在存儲函數/觸發器中只計算一次;SYSDATE() 每次調用取實時值,複製場景下行為不同。
| 函數 | 說明 | 範例 | 返回示例 |
|---|---|---|---|
CHAR_LENGTH(s) / CHARACTER_LENGTH(s) | 字符數(多位元組字符計 1) | SELECT CHAR_LENGTH('中文'); | 2 |
LENGTH(s) | 位元組數 | SELECT LENGTH('中文'); | 6 (utf8mb4) |
CONCAT(s1, s2, ...) | 拼接,任一 NULL 結果 NULL | SELECT CONCAT('a', NULL, 'c'); | NULL |
CONCAT_WS(sep, s1, s2, ...) | 帶分隔符拼接,自動跳過 NULL | SELECT CONCAT_WS(',', 'a', NULL, 'c'); | a,c |
UPPER(s) / LOWER(s) | 大小寫轉換 | SELECT UPPER('abc'); | ABC |
TRIM([BOTH|LEADING|TRAILING] [remstr] FROM s) | 去除首尾空白或指定字符 | SELECT TRIM(' abc '); | abc |
SUBSTRING(s, pos, len) / SUBSTR(s, pos, len) | 子串提取(位置從 1 開始,負數倒數) | SELECT SUBSTRING('abcdef', 2, 3); | bcd |
REPLACE(s, from_str, to_str) | 全量替換 | SELECT REPLACE('a,b,c', ',', ';'); | a;b;c |
LOCATE(substr, s, [pos]) / INSTR(s, substr) | 子串首次出現位置 | SELECT LOCATE('b', 'abc'); | 2 |
LEFT(s, len) / RIGHT(s, len) | 左/右定長截取 | SELECT LEFT('abcdef', 3); | abc |
| 函數 | 說明 | 範例 | 返回示例 |
|---|---|---|---|
ABS(x) | 絕對值 | SELECT ABS(-5); | 5 |
CEIL(x) / CEILING(x) | 向上取整 | SELECT CEIL(5.1); | 6 |
FLOOR(x) | 向下取整 | SELECT FLOOR(5.9); | 5 |
ROUND(x, [d]) | 四捨五入,d 為小數位 | SELECT ROUND(5.678, 2); | 5.68 |
TRUNCATE(x, d) | 截斷(不四捨五入) | SELECT TRUNCATE(5.678, 2); | 5.67 |
MOD(x, y) / x % y | 取模/餘數 | SELECT MOD(10, 3); | 1 |
POW(x, y) / POWER(x, y) | 冪運算 | SELECT POW(2, 3); | 8 |
SQRT(x) | 平方根 | SELECT SQRT(16); | 4 |
RAND([seed]) | 隨機數 0~1,種子固定可復現 | SELECT RAND(); | 0.123... |
SIGN(x) | 符號:正 1、零 0、負 -1 | SELECT SIGN(-5); | -1 |
| 函數 | 類型 | 說明 | 安全性建議 |
|---|---|---|---|
MD5(str) | 雜湊 | 128 位十六進位字串,不可逆 | 僅用於非安全場景(檔案校驗),密碼嚴禁 |
SHA1(str) / SHA(str) | 雜湊 | 160 位,不可逆 | 同 MD5,不適合密碼存儲 |
SHA2(str, hash_len) | 雜湊 | 支援 224/256/384/512 位 | SHA2(str, 256) 可作一般雜湊,密碼仍需專用 |
PASSWORD(str) | 專用 | MySQL 內部認證雜湊,**8.0 已移除** | 嚴禁業務使用,版本不兼容 |
AES_ENCRYPT(str, key) / AES_DECRYPT(crypt, key) | 對稱加密 | AES-128-ECB,金鑰長度 16 位元組 | 金鑰管理難,建議應用層加密 |
ENCODE(str, pwd) / DECODE(crypt, pwd) | 弱加密 | **已棄用/移除**,極不安全 | 嚴禁使用 |
-- 應用層使用 bcrypt / Argon2id / PBKDF2 -- 偽碼示例: hash = bcrypt.hashpw(password, bcrypt.gensalt(rounds=12)) -- 驗證: bcrypt.checkpw(password, hash)
原則:資料庫只存儲雜湊值,**不做加密運算**;採用自帶鹽值、可調計算成本、記憶體困難的專用演算法。
DATE_FORMAT(NOW(), '%Y-%m-01 00:00:00')DATE_SUB(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 SECOND)CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4))REPLACE(UUID(), '-', '') → 32 位十六進位將此手冊加入收藏,下次寫 SQL 遇到「這個函數怎麼用」直接檢索,效率翻倍。