SQL Server → MySQL 遷移中,CONVERT 函數參數順序相反、目標類型關鍵字不同、特殊識別符語法差異,是 SQL 改寫高頻踩坑點。本文整理對照表與最佳實踐。
| 項目 | SQL Server | MySQL | 關鍵差異 |
|---|---|---|---|
| 語法 | CONVERT(target_type, expression) | CONVERT(expression, target_type) | 參數順序相反 |
| 整數轉換 | CONVERT(INT, Port) | CONVERT(Port, SIGNED) 或 CAST(Port AS SIGNED) | 類型關鍵字不同 |
| 結果別名 | 自動繼承欄位名 | 必須加 AS \`port\`,否則結果欄位名為 CONVERT(Port, SIGNED) | 別名強制要求 |
| 特殊識別符 | 方括號 [Port] | 反引號 \`Port\` (鍵盤 Esc 下鍵) | 語法不同 |
第二個參數 (目標類型) 只能是以下值之一:
| 類型關鍵字 | 說明 | 範例 |
|---|---|---|
BINARY[(N)] | 二進位字串,N 位元組長度 | CONVERT(str, BINARY) 區分大小寫比較 |
CHAR[(N)] | 字符串,N 字符長度 | CONVERT(num, CHAR) 數字轉字串 |
DATE | 日期 | CONVERT('2023-01-01', DATE) |
DATETIME | 日期時間 | CONVERT('2023-01-01 12:00', DATETIME) |
DECIMAL | 定點數 (可指定精度 DECIMAL(10,2)) | CONVERT('123.45', DECIMAL(10,2)) |
SIGNED [INTEGER] | 有符號整數 | CONVERT('123', SIGNED) |
TIME | 時間 | CONVERT('12:30:00', TIME) |
UNSIGNED [INTEGER] | 無符號整數 | CONVERT('123', UNSIGNED) |
-- SQL Server
SELECT CONVERT(INT, Port) AS Port FROM ServerConfig;
-- MySQL (推薦 CAST,標準 SQL)
SELECT CAST(`Port` AS SIGNED) AS `Port` FROM `ServerConfig`;
-- 或 CONVERT
SELECT CONVERT(`Port`, SIGNED) AS `Port` FROM `ServerConfig`;
-- SQL Server
SELECT CONVERT(DATE, CreateTime) FROM Logs;
-- MySQL
SELECT CAST(`CreateTime` AS DATE) AS `CreateDate` FROM `Logs`;
-- 或 DATE() 函數更簡潔
SELECT DATE(`CreateTime`) AS `CreateDate` FROM `Logs`;
-- SQL Server: 不區分大小寫預設
WHERE [UserName] = 'Admin'
-- MySQL: 區分大小寫比較
WHERE BINARY `UserName` = 'Admin'
-- 或
WHERE CONVERT(`UserName`, BINARY) = 'Admin'
-- 或欄位定義為 VARBINARY / COLLATE utf8mb4_bin
-- SQL Server 保留字/特殊字符欄位
SELECT [Order], [Group], [User Name] FROM [Order Details];
-- MySQL 反引號包裹
SELECT `Order`, `Group`, `User Name` FROM `Order Details`;
CONVERT(,逐個檢查參數順序與目標類型映射CONVERT 結果欄位補充 AS \`alias\`[...] 批次替換為反引號 \`...\` (工具:正則 \[([^\]]+)\] → `$1`)CAST/CONVERT 避免索引失效CAST(expr AS type): 跨資料庫可移植、可讀性高、參數順序固定 (expr AS type)。DATE()/TIME()/CAST(... AS UNSIGNED) 更語義化。類型轉換看似微小,實則是異構遷移「細節決定成敗」的典型代表。建立對照表、工具化替換、測試驗證三步走,讓 CONVERT 遷移零驚險。