| 函數 | 語法 | 說明 | 示例 | 結果 |
|---|---|---|---|---|
| 求余 | 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 直接對應。
| 分類 | 函數 | 語法/說明 | 示例 | 結果 |
|---|---|---|---|---|
| 長度 | 字符數 | CHAR_LENGTH(str) / CHARACTER_LENGTH(str) | CHAR_LENGTH('你好') | 2 |
| 字節數 | LENGTH(str) | LENGTH('你好') (utf8mb4) | 6 | |
| 拼接 | CONCAT | CONCAT(s1, s2, ...) 任一參數為 NULL 結果 NULL | CONCAT('a','b') | ab |
| CONCAT_WS | CONCAT_WS(sep, s1, s2, ...) 帶分隔符,忽略 NULL | CONCAT_WS('-','1st','2nd') | 1st-2nd | |
| GROUP_CONCAT | 聚合拼接 GROUP_CONCAT(col SEPARATOR ',') | 分組拼接 | a,b,c | |
| 替換/插入 | INSERT | INSERT(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 | 單側去空格 | |||
| 重複 | REPEAT | REPEAT(str, count) (SQL Server: REPLICATE) | REPEAT('a', 3) | aaa |
| 比較 | STRCMP | STRCMP(s1, s2) 相等 0,s1STRCMP('a','b')-1 | | |
| 定位 | LOCATE | LOCATE(substr, str, [pos]) 返回首次出現位置 (1-based) | LOCATE('ball','football') | 5 |
| POSITION | POSITION(substr IN str) 標準 SQL 寫法 | |||
| INSTR | INSTR(str, substr) 參數順序相反 (類 SQL Server CHARINDEX) | |||
| 按位置取值 | ELT | ELT(n, s1, s2, ...) 返回第 n 個字符串,越界返回 NULL | ELT(2, 'a', 'b', 'c') | b |
| 查找位置 | FIELD | FIELD(str, s1, s2, ...) 返回 str 在列表中首次位置,找不到返回 0 | FIELD('hi', 'a', 'hi', 'c') | 2 |
| 集合查找 | FIND_IN_SET | FIND_IN_SET(str, strlist) strlist 逗號分隔,str 含逗號則失效 | FIND_IN_SET('b', 'a,b,c') | 2 |
| 位掩碼取值 | MAKE_SET | MAKE_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() |
| 提取組件 | MySQL | SQL 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) |
| 計算/格式化 | MySQL | SQL 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 差異 |
|---|---|---|---|
| IF | IF(expr, true_val, false_val) | expr 為真 (非0/非NULL) 返回 true_val,否則 false_val | SQL Server IIF (2012+) 語法相同,但 IF 是流程控制語句 |
| IFNULL | IFNULL(v1, v2) | v1 非 NULL 返回 v1,否則 v2 (類 Oracle NVL) | SQL Server ISNULL(v1, v2) 功能相同;NULLIF(a,b) 相等返回 NULL,不同返回 a (反義) |
| CASE | CASE 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; -- 僅前 100 條 SHOW FULL PROCESSLIST; -- 完整 INFO 欄位 + 內存信息
列含義:Id(連接ID)、User、Host(IP:Port)、DB、Command(Sleep/Query/Connect)、Time(秒)、State(執行狀態)、Info(SQL文本)。Root 可見所有,普通用戶僅見自己。
| 函數 | 語法 | 特點 | 示例 |
|---|---|---|---|
| PASSWORD | PASSWORD(str) | MySQL 內部認證用,單向、不可逆、版本間算法可能變,**嚴禁業務使用** | PASSWORD('123') → *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| MD5 | MD5(str) | 128位,32位十六進制字符串,不可逆 | MD5('123') → 202cb962ac59075b964b07152d234b70 |
| SHA1/SHA2 | SHA1(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/DECODE | ENCODE(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, UNSIGNED | CAST(100 AS CHAR(2)) → '10' |
my.cnf → [mysqld] character-set-server=utf8mb4 + [client] default-character-set=utf8mb4 → 重啟LAST_INSERT_ID() 會話級隔離,多表連續插入返回各表首行 ID,不同於 SQL Server SCOPE_IDENTITY() / IDENT_CURRENT()PASSWORD() 非業務加密,用戶密碼存儲請用 SHA2(CONCAT(salt, pwd), 256) 或 bcrypt/argon2 (應用層)