在 SQL 語句中處理包含特殊字符的字符串時,轉義是必須掌握的基本功。MySQL 使用反斜線 \ 作為轉義字符,識別多種轉義序列。本文系統整理轉義規則、引號處理策略及實戰技巧。
| 序列 | 字符 | ASCII | 說明 |
|---|---|---|---|
| \0 | NUL | 0 | 空字符 |
| \' | 單引號 | 39 | 字符串邊界 |
| \" | 雙引號 | 34 | 字符串邊界 |
| \b | 退格 | 8 | |
| \n | 換行 | 10 | |
| \r | 回車 | 13 | |
| \t | 製表符 | 9 | |
| \z | Control-Z | 26 | Windows 文件結束符,LOAD DATA 時需處理 |
| \\ | 反斜線 | 92 | 轉義字符本身 |
| \% | 百分號 | 37 | LIKE 通配符轉義 |
| \_ | 下劃線 | 95 | LIKE 通配符轉義 |
-- 單引號字符串內的單引號用 '' 表示
SELECT 'It''s a test'; -- It's a test
-- 雙引號字符串內的雙引號用 "" 表示
SELECT "He said ""Hello"""; -- He said "Hello"
SELECT 'It\'s a test'; -- It's a test
SELECT "He said \"Hi\""; -- He said "Hi"
-- 單引號包裹雙引號,無需轉義
SELECT 'He said "Hello"';
-- 雙引號包裹單引號,無需轉義
SELECT "It's a test";
SELECT '\\'; -- 顯示單個反斜線
mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', ''hello';
+-------+--------+-----------+--------+-------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+--------+-----------+--------+-------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+--------+-----------+--------+-------+
在 LIKE 模式中,% 和 _ 是通配符。若要查找字面量 % 或 _,必須轉義:
-- 查找包含 "50%" 的字符串
SELECT * FROM t WHERE col LIKE '%50\%%' ESCAPE '\';
-- 查找包含 "_" 的字符串
SELECT * FROM t WHERE col LIKE '%\_%' ESCAPE '\';
-- 自定義轉義字符(避免與數據衝突)
SELECT * FROM t WHERE col LIKE '%50|%' ESCAPE '|';
-- Python 例
sql = "SELECT * FROM user WHERE name = '" + name + "'" -- SQL 注入風險,轉義易漏
| 語言 | 推薦方式 | 示例 |
|---|---|---|
| Python (PyMySQL) | 參數化 | cursor.execute("SELECT * FROM user WHERE name = %s", (name,)) |
| Java (JDBC) | PreparedStatement | ps = conn.prepareStatement("SELECT * FROM user WHERE name = ?"); ps.setString(1, name); |
| Go (database/sql) | 參數化 | db.Query("SELECT * FROM user WHERE name = ?", name) |
| PHP (PDO) | PreparedStatement | $stmt = $pdo->prepare("SELECT * FROM user WHERE name = ?"); $stmt->execute([$name]); |
| Node.js (mysql2) | 參數化 | conn.execute("SELECT * FROM user WHERE name = ?", [name]) |
永遠不要手動拼接 SQL 字符串。使用驅動程序提供的參數化查詢,由驅動層自動處理轉義、類型轉換、編碼,同時防止 SQL 注入。
導入文件時,\z (Control-Z) 在 Windows 下會被視為 EOF 導致導入中斷。解決方法:
-- 指定轉義字符
LOAD DATA INFILE 'data.txt' INTO TABLE t
FIELDS ESCAPED BY '\\' -- 或其他不衝突字符
LINES TERMINATED BY '\r\n';
\ 轉義,支援 10 種常用序列% _ 必須轉義,可自定義 ESCAPE 字符