必须用ESCAPE子句显式转义:WHERE name LIKE 'A%B' ESCAPE '';方括号[需写成[[,右括号]写成]];SQL Server列名含特殊字符须用[]包裹,如[A/B];MySQL不可见字符需用REPLACE+TRIM清理。

SQL LIKE 中的 %、_、[ 等特殊字符怎么匹配
直接写 WHERE name LIKE '%test%' 是没问题的,但一旦字段值本身含 %、_、[、],用 LIKE 就会误判——比如查字符串 'A%B',LIKE 'A%B' 实际匹配的是 A 开头、B 结尾、中间任意长的任意字符,根本不是字面意思。
必须显式声明哪些字符要当普通字符处理。标准做法是加 ESCAPE 子句,并选一个不常出现的转义符(如 或 !):
WHERE name LIKE 'A%B' ESCAPE ''
这时 % 才表示字面意义的百分号。注意:转义符本身如果出现在数据里,得重复两次,比如查 'path oile',就得写 'path\to\file'(配合 ESCAPE '')。
-
[必须写成[(或[[],但后者是 SQL Server 特有写法,不可移植) -
]可直接写,但为对称建议也写成] - 不要用
/或#当转义符——它们在部分驱动或 ORM 中可能被提前解析或冲突 - MySQL 8.0+ 默认
ESCAPE是反斜杠,但若字段值本身大量含,建议换用!避免双重转义混乱
SQL Server 里列名含 /、空格、括号怎么引用
列名是 A/B、user name、[id] 这类带特殊符号的,不加包裹就会报错:“Invalid column name” 或解析失败。SQL Server 规定:用方括号 [] 包起来即可,这是唯一通用且安全的方式。
示例:
SELECT [A/B], [user name], [[id]] FROM users;
注意:[[id]] 是因为右括号 ] 在方括号内属于特殊字符,必须用 ]] 表示字面右括号;左括号 [ 不需要额外转义。
- 别用双引号(
"A/B"),那是标准 SQL 的标识符引用方式,SQL Server 默认关闭QUOTED_IDENTIFIER时会失效 - 别依赖自动识别——即使名字只含空格,不加
[]也会被当作两个词解析 - 在动态 SQL 或 ORM 映射中,列名拼接前务必先套一层
[],否则用户自定义字段名一含特殊字符就崩
MySQL 关联字段含不可见字符(空格、制表符)导致 ON 不匹配
即使写了 TRIM(t1.name) = TRIM(t2.name),依然匹配不上?大概率是字段里混了全角空格、 、
或零宽空格(U+200B)。MySQL 的 TRIM() 只处理 ASCII 空格、制表符、换行符和回车符,对全角空格(U+3000)或 Unicode 控制字符完全无效。
临时查问题可用:
SELECT HEX(name), LENGTH(name), name FROM t1 WHERE name LIKE '% %';
看十六进制输出是否含 A0(NO-BREAK SPACE)、200B(ZERO WIDTH SPACE)等。
- 修复匹配:用
REPLACE(REPLACE(name, CHAR(160), ''), CHAR(0x200B), '')清掉常见不可见字符,再TRIM() - 更彻底:建表时字段加
COLLATE utf8mb4_0900_as_cs,它对空格和控制字符更敏感,能减少隐式歧义 - ORM 如 SqlSugar 或 SQLAlchemy 中,别只靠 C# 或 Python 层的
.strip()—— 数据库层未清理,关联时照样走不到索引
SQLAlchemy 连接 URL 中密码含 @、/、: 怎么编码
错误写法:mysql+pymysql://user:pass@word@host/db —— 第一个 @ 被当成用户名/密码分隔符,第二个 @ 被当成密码/主机分隔符,整个 URL 解析错乱,抛出 ArgumentError: Could not parse rfc1738 URL。
必须对密码做 URL 编码,且只编码密码部分(不能整个 URL 都 encode):
-
@→%40 -
:→%3A -
/→%2F -
?→%3F -
#→%23 - 其他保留字符同理,查 RFC 1738 表
正确连接串示例:
mysql+pymysql://user:pass%40word%2Ftest%3A123@localhost:3306/mydb
Python 中推荐用 urllib.parse.quote_plus() 处理密码,而不是手写编码:
from urllib.parse import quote_plus<br>password = quote_plus("pass@word/test:123")<br>url = f"mysql+pymysql://user:{password}@localhost:3306/mydb"别漏掉端口后的 :3306 —— 如果省略,默认端口可能因驱动而异(PyMySQL 是 3306,但某些旧驱动默认 3307),显式写上最稳。

















