TRIM(col) = col最稳妥,可准确识别首尾无空白的字符串;但无法排除中间空格,且对全角空格、制表符等需额外处理,NULL值判断结果为UNKNOWN。

WHERE 字段 NOT LIKE '% %' 的陷阱
直接用 NOT LIKE '% %' 看似合理,但会漏掉开头或结尾有空格的记录,比如 ' abc' 或 'abc ' —— 这些值里确实有空格,但不匹配 '% %'(中间两个字符之间有空格的模式)。更关键的是,它完全无法识别制表符、换行符等其他空白字符。
用 TRIM() 判断是否“真正无空白”
最稳妥的方式是看“去除首尾空白后是否等于原值”,因为 TRIM() 默认会去掉空格、 、
、
(具体行为依数据库而定,但主流都支持)。只要字段值首尾没空白,且中间也没空白,那么 TRIM(col) 就和 col 完全相等。
实操写法:
SELECT * FROM table_name WHERE TRIM(col) = col;
注意点:
- MySQL 8.0+、PostgreSQL、SQL Server 2017+、Oracle 都支持标准
TRIM()行为 - SQLite 只支持单字符 trim,得写成
TRIM(TRIM(TRIM(col, CHAR(9)), CHAR(10)), CHAR(13)) = col(CHAR(9)=tab, 10=LF, 13=CR) - 如果字段允许 NULL,
TRIM(NULL) = NULL结果是 UNKNOWN,所以该行不会被选中——这通常符合预期,但需确认业务是否要显式排除 NULL
需要严格排除“任何位置含空白”的场景
上面的 TRIM(col) = col 只保证首尾无空白,但中间有空格(如 'a b')仍会被选中。若真要“整列不能出现任意空白字符”,就得依赖正则或字符扫描。
各库典型写法:
- PostgreSQL:
WHERE col !~ 's'(s匹配所有空白) - MySQL 8.0+:
WHERE col NOT REGEXP '\s' - SQL Server:
WHERE col NOT LIKE '%[ ' + CHAR(9) + CHAR(10) + CHAR(13) + ']%'(需手动列出常见空白) - Oracle:
WHERE REGEXP_LIKE(col, 's') = 0
性能提示:这类正则/模糊匹配基本无法走索引,大数据量时慎用。
别忽略 COLLATION 和不可见字符
某些字符看起来像空格,实则是全角空格(U+3000)、零宽空格(U+200B)等。普通 TRIM() 和 s 通常不覆盖它们。
如果业务数据来源混乱(比如从网页粘贴、OCR 识别),建议先采样检查:
SELECT col, LENGTH(col), DUMP(col) FROM table_name WHERE col LIKE '% %' OR LENGTH(TRIM(col)) != LENGTH(col) LIMIT 5;
DUMP()(Oracle)或 HEX(col)(MySQL)能暴露真实字节,这是定位“隐形空白”的唯一可靠方式。

















