Vấn đề: Escape backslash
Backslash \ là ký tự escape trong MySQL string literal. Cần escape gấp đôi.
Giải pháp: DELETE với escape đúng
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (FolderName VARCHAR(100));
mysql> INSERT INTO DemoTable VALUES('????');
mysql> INSERT INTO DemoTable VALUES('\\\\'); -- Lưu thực tế: \\
Dữ liệu gốc
+------------+ | FolderName | +------------+ | ???? | | \\ | +------------+
Xóa dòng có '\\' (2 backslash)
mysql> DELETE FROM DemoTable WHERE FolderName = '\\\\\\\\';
Giải thích: '\\\\\\\\' trong SQL string → \\\\ thực tế → so khớp với \\ trong DB
Kết quả
+------------+ | FolderName | +------------+ | ???? | +------------+
Quy tắc Escape Backslash
| Context | Muốn lưu | Viết trong SQL |
|---|---|---|
| String literal | \ | '\\\\' |
| String literal | \\ | '\\\\\\\\' |
| LIKE pattern | \ | '\\\\\\\\' (cần escape cho LIKE + SQL) |
| REGEXP | \ | '\\\\\\\\' (cần escape cho REGEXP + SQL) |
Cách an toàn hơn: Prepared Statement
-- Application code (PHP PDO)
$stmt = $pdo->prepare("DELETE FROM DemoTable WHERE FolderName = ?");
$stmt->execute(['\\\\']); -- Không cần escape thủ công
Hàm QUOTE()
mysql> SELECT QUOTE('\\'); -- '\\\\'
mysql> SELECT QUOTE('\\\\'); -- '\\\\\\\\'
Lưu ý phiên bản
- MySQL < 5.7:
NO_BACKSLASH_ESCAPESSQL mode thay đổi hành vi - MySQL 8.0: Mặc định bật backslash escape
- Best practice: Dùng parameterized query, tránh concat string
Tìm dòng chứa backslash
-- Chứa ít nhất 1 backslash WHERE FolderName LIKE '%\\\\%' -- Chứa đúng 2 backslash WHERE FolderName = '\\\\' -- Hoặc WHERE FolderName LIKE '%\\\\%' AND FolderName NOT LIKE '%\\\\\\\\%'