首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 進階函數大全:數學/字符串/日期/條件/系統/加密/其他分類實戰指南 (對比 SQL Server)

     編輯:MySQL 綜合教學

一、數學函數

函數語法說明示例結果
求余MOD(x, y)x 除以 y 的余數,支持小數MOD(10, 3)1
截取 (不四捨五入)TRUNCATE(x, d)保留 d 位小數,d<0 向左截取TRUNCATE(1.32, 1)1.3
四捨五入ROUND(x, d)標準四捨五入ROUND(1.35, 1)1.4

對比 SQL Server:% 運算符求余,ROUND 行為一致,無 TRUNCATE 直接對應。

二、字符串函數 (MySQL 豐富度遠超 SQL Server)

分類函數語法/說明示例結果
長度字符數CHAR_LENGTH(str) / CHARACTER_LENGTH(str)CHAR_LENGTH('你好')2
字節數LENGTH(str)LENGTH('你好') (utf8mb4)6
拼接CONCATCONCAT(s1, s2, ...) 任一參數為 NULL 結果 NULLCONCAT('a','b')ab
CONCAT_WSCONCAT_WS(sep, s1, s2, ...) 帶分隔符,忽略 NULLCONCAT_WS('-','1st','2nd')1st-2nd
GROUP_CONCAT聚合拼接 GROUP_CONCAT(col SEPARATOR ',')分組拼接a,b,c
替換/插入INSERTINSERT(str, pos, len, newstr) 從 pos 替換 len 字符 (類 SQL Server STUFF)INSERT('abcdef', 2, 3, 'XY')aXYef
填充左填充LPAD(str, len, padstr) 長度不足左側填充,超長截斷LPAD('hi', 5, '?')???hi
右填充RPAD(str, len, padstr)RPAD('hi', 5, '?')hi???
去除兩側空格TRIM(str) / TRIM(BOTH ' ' FROM str)TRIM(' hi ')hi
指定字符TRIM(BOTH 'xy' FROM 'xyxboxyokxxyxy')xboxyokx
LTRIM/RTRIM單側去空格
重複REPEATREPEAT(str, count) (SQL Server: REPLICATE)REPEAT('a', 3)aaa
比較STRCMPSTRCMP(s1, s2) 相等 0,s1STRCMP('a','b')-1
定位LOCATELOCATE(substr, str, [pos]) 返回首次出現位置 (1-based)LOCATE('ball','football')5
POSITIONPOSITION(substr IN str) 標準 SQL 寫法
INSTRINSTR(str, substr) 參數順序相反 (類 SQL Server CHARINDEX)
按位置取值ELTELT(n, s1, s2, ...) 返回第 n 個字符串,越界返回 NULLELT(2, 'a', 'b', 'c')b
查找位置FIELDFIELD(str, s1, s2, ...) 返回 str 在列表中首次位置,找不到返回 0FIELD('hi', 'a', 'hi', 'c')2
集合查找FIND_IN_SETFIND_IN_SET(str, strlist) strlist 逗號分隔,str 含逗號則失效FIND_IN_SET('b', 'a,b,c')2
位掩碼取值MAKE_SETMAKE_SET(bits, s1, s2, ...) bits 二進制對應位為 1 的字符串拼接MAKE_SET(5, 'a', 'b', 'c') (101)a,c

三、日期時間函數

分類MySQL 函數SQL Server 對應說明
當前時間NOW() / SYSDATE()GETDATE() / SYSDATETIME()NOW() 返回語句開始時間,SYSDATE() 返回實時執行時間
CURDATE() / CURRENT_DATE()CAST(GETDATE() AS DATE)僅日期
CURTIME() / CURRENT_TIME()CAST(GETDATE() AS TIME)僅時間
UTC_DATE() / UTC_TIME() / UTC_TIMESTAMP()GETUTCDATE()UTC 時間 (MySQL 分離日期/時間,SQL Server 合一)
LOCALTIME() / LOCALTIMESTAMP()同 NOW()
提取組件MySQLSQL Server
年YEAR(date) / EXTRACT(YEAR FROM date)DATEPART(YEAR, date) / YEAR(date)
月MONTH(date) / EXTRACT(MONTH FROM date)DATEPART(MONTH, date) / MONTH(date)
月名MONTHNAME(date)DATENAME(MONTH, date)
日DAY(date) / EXTRACT(DAY FROM date)DATEPART(DAY, date) / DAY(date)
季度QUARTER(date)DATEPART(QUARTER, date)
周WEEK(date, mode) / EXTRACT(WEEK FROM date)DATEPART(WEEK, date)
小時/分/秒HOUR/MINUTE/SECOND(time)DATEPART(HOUR/MINUTE/SECOND, time)
計算/格式化MySQLSQL Server
日期加減DATE_ADD(date, INTERVAL expr unit) / DATE_SUB(...)DATEADD(unit, expr, date)
時間加減ADDTIME(time, expr) / SUBTIME(time, expr)DATEADD(SECOND, ...) 統一用 DATEADD
日期差DATEDIFF(date1, date2) (天數)DATEDIFF(day, date1, date2)
格式化輸出DATE_FORMAT(date, format) / TIME_FORMAT(time, format)FORMAT(date, 'fmt') / CONVERT(VARCHAR, date, style)
秒↔時間TIME_TO_SEC(time) / SEC_TO_TIME(seconds)無直對應,需計算

四、條件判斷 (流程控制) 函數

函數語法說明SQL Server 差異
IFIF(expr, true_val, false_val)expr 為真 (非0/非NULL) 返回 true_val,否則 false_valSQL Server IIF (2012+) 語法相同,但 IF 是流程控制語句
IFNULLIFNULL(v1, v2)v1 非 NULL 返回 v1,否則 v2 (類 Oracle NVL)SQL Server ISNULL(v1, v2) 功能相同;NULLIF(a,b) 相等返回 NULL,不同返回 a (反義)
CASECASE WHEN cond THEN val ... ELSE val END (搜索式)
CASE expr WHEN val THEN res ... ELSE res END (簡單式)
返回類型為所有分支兼容類型語法一致,但 SQL Server 簡單式 CASE expr WHEN val THEN res 要求類型嚴格匹配

五、系統信息函數

函數說明示例輸出
VERSION()服務器版本字符串 (utf8)5.7.33-log
CONNECTION_ID()當前連接 ID (線程 ID)42
DATABASE() / SCHEMA()當前默認數據庫test_db
USER() / CURRENT_USER() / SESSION_USER() / SYSTEM_USER()認證用戶@主機 (USER() 為客戶端聲明,CURRENT_USER() 為服務器認證身份,可能不同)root@localhost
CHARSET(str)字符串字符集utf8mb4
COLLATION(str)字符串校對規則utf8mb4_0900_ai_ci
LAST_INSERT_ID()上一條 INSERT/UPDATE 產生的首個 AUTO_INCREMENT 值 (會話級,批量插入返回第一行值)批量插入 3 行,返回第一行 ID (SQL Server SCOPE_IDENTITY() 返回最後一行)

SHOW PROCESSLIST 進階

SHOW PROCESSLIST;        -- 僅前 100 條
SHOW FULL PROCESSLIST;   -- 完整 INFO 欄位 + 內存信息

列含義:Id(連接ID)、User、Host(IP:Port)、DB、Command(Sleep/Query/Connect)、Time(秒)、State(執行狀態)、Info(SQL文本)。Root 可見所有,普通用戶僅見自己。

六、加密函數

函數語法特點示例
PASSWORDPASSWORD(str)MySQL 內部認證用,單向、不可逆、版本間算法可能變,**嚴禁業務使用**PASSWORD('123') → *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
MD5MD5(str)128位,32位十六進制字符串,不可逆MD5('123') → 202cb962ac59075b964b07152d234b70
SHA1/SHA2SHA1(str) / SHA2(str, 256|512)更安全,推薦 SHA2-256
AES 加密AES_ENCRYPT(str, key_str)對稱加密,ECB 模式,密鑰長度 128/192/256 位
AES 解密AES_DECRYPT(crypt_str, key_str)
ENCODE/DECODEENCODE(str, pwd) / DECODE(crypt_str, pwd)弱加密,**已棄用/移除 (8.0+)**,勿用

七、其他實用函數

函數語法用途示例
格式化數字FORMAT(x, n)千分位分隔 + 保留 n 位小數 (四捨五入),返回字符串FORMAT(12332.123465, 4) → '12,332.1235'
進制轉換CONV(n, from_base, to_base)2-36 進制互轉CONV('a', 16, 2) → '1010'
IP↔長整型INET_ATON('192.168.1.1') / INET_NTOA(3232235777)IPv4 地址存儲優化 (INT UNSIGNED)3232235777 ↔ 192.168.1.1
命名鎖GET_LOCK(name, timeout) / RELEASE_LOCK(name) / IS_FREE_LOCK(name) / IS_USED_LOCK(name)應用層分布式鎖/互斥,超時秒數
性能基準BENCHMARK(count, expr)重複執行 expr count 次,返回 0,客戶端顯示耗時BENCHMARK(1000000, MD5('test'))
字符集轉換CONVERT(str USING charset)數據字符集轉換CONVERT('test' USING latin1)
類型轉換CAST(expr AS type) / CONVERT(expr, type)type: BINARY, CHAR(n), DATE, TIME, DATETIME, DECIMAL, SIGNED, UNSIGNEDCAST(100 AS CHAR(2)) → '10'

八、避坑與最佳實踐 TIPs

  1. 日期存儲為字符串 可用字符串函數截取,但強烈建議用原生 DATE/TIME 類型 + 日期函數
  2. 修改默認字符集:my.cnf → [mysqld] character-set-server=utf8mb4 + [client] default-character-set=utf8mb4 → 重啟
  3. LAST_INSERT_ID() 會話級隔離,多表連續插入返回各表首行 ID,不同於 SQL Server SCOPE_IDENTITY() / IDENT_CURRENT()
  4. BENCHMARK 時間為客戶端壁鐘時間,非服務端 CPU 時間,受網絡/調度影響
  5. PASSWORD() 非業務加密,用戶密碼存儲請用 SHA2(CONCAT(salt, pwd), 256) 或 bcrypt/argon2 (應用層)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved