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

MySQL 特殊字符轉義完全指南:單引號、雙引號、通配符處理

     編輯:MySQL 綜合教學

前言

在 SQL 語句中處理包含特殊字符的字符串時,轉義是必須掌握的基本功。MySQL 使用反斜線 \ 作為轉義字符,識別多種轉義序列。本文系統整理轉義規則、引號處理策略及實戰技巧。

MySQL 識別的轉義序列

序列字符ASCII說明
\0NUL0空字符
\'單引號39字符串邊界
\"雙引號34字符串邊界
\b退格8
\n換行10
\r回車13
\t製表符9
\zControl-Z26Windows 文件結束符,LOAD DATA 時需處理
\\反斜線92轉義字符本身
\%百分號37LIKE 通配符轉義
\_下劃線95LIKE 通配符轉義

引號處理四大策略

策略 1:同類引號雙寫轉義

-- 單引號字符串內的單引號用 '' 表示
SELECT 'It''s a test';  -- It's a test

-- 雙引號字符串內的雙引號用 "" 表示
SELECT "He said ""Hello""";  -- He said "Hello"

策略 2:反斜線轉義(通用)

SELECT 'It\'s a test';   -- It's a test
SELECT "He said \"Hi\"";  -- He said "Hi"

策略 3:異類引號包裹(最簡潔)

-- 單引號包裹雙引號,無需轉義
SELECT 'He said "Hello"';  

-- 雙引號包裹單引號,無需轉義
SELECT "It's a test";

策略 4:轉義字符自轉義

SELECT '\\';  -- 顯示單個反斜線

實戰演示

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', ''hello';
+-------+--------+-----------+--------+-------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+--------+-----------+--------+-------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+--------+-----------+--------+-------+

LIKE 查詢中的特殊處理

在 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)PreparedStatementps = 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 注入。

LOAD DATA INFILE 特殊處理

導入文件時,\z (Control-Z) 在 Windows 下會被視為 EOF 導致導入中斷。解決方法:

-- 指定轉義字符
LOAD DATA INFILE 'data.txt' INTO TABLE t 
FIELDS ESCAPED BY '\\'  -- 或其他不衝突字符
LINES TERMINATED BY '\r\n';

總結

  • MySQL 用 \ 轉義,支援 10 種常用序列
  • 引號處理首選「異類引號包裹」,其次「同類雙寫」,最後「反斜線」
  • LIKE 查詢中 % _ 必須轉義,可自定義 ESCAPE 字符
  • 生產代碼務必使用參數化查詢,拒絕手動拼接
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved