REPLACE(col, ' ', '') 還留有空格?「空格」不只有 ASCII 32(0x20):
U+3000(中文輸入法下空格)U+00A0( )\t、換行 \n、換頁 \f、垂直製表 \vU+200B、細空格 U+2009 等 Unicode 空白字元MySQL REPLACE 區分字元,僅替換完全匹配的字串。
UPDATE `v9_news`
SET `description` = REPLACE(REPLACE(REPLACE(`description`, ' ', ''), CHAR(160), ''), CHAR(12288), '');
-- CHAR(160)= CHAR(12288)=全形空格
技巧:從問題數據中 COPY 一個看不見的字元,直接粘貼進 SQL 字串字面值。
TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str)
| 語法 | 效果 | 範例 |
|---|---|---|
TRIM(' abc ') | 兩端去除空格 | 'abc' |
TRIM(LEADING 'x' FROM 'xxxabcxxx') | 左側去除 'x' | 'abcxxx' |
TRIM(BOTH 'xyz' FROM 'abcxyz') | 兩端去除 'xyz' | 'abc' |
TRIM(TRAILING 'xyz' FROM 'abcxyz') | 右側去除 'xyz' | 'abc' |
remstr 為空格(ASCII 32),不支援正則或多字元集合。REGEXP_REPLACE)UPDATE `t`
SET `col` = REGEXP_REPLACE(`col`, '[[:space:]]+', '')
WHERE `col` REGEXP '[[:space:]]';
[[:space:]] 涵蓋所有 Unicode 空白字元(需 8.0.4+)。入庫前在代碼層統一規範化:
# Python
import re
clean = re.sub(r'\s+', '', raw_str) # \s 匹配所有 Unicode 空白
# Java
clean = rawStr.replaceAll("\\p{Space}+", "");
# PHP
clean = preg_replace('/\s+/u', '', $rawStr);
CHECK CONSTRAINT(8.0.16+)防臟數據入庫。-- 發現含非常規空白的行
SELECT `id`, `col`, HEX(`col`) AS hex_col
FROM `t`
WHERE `col` != TRIM(`col`)
OR `col` LIKE CONCAT('%', CHAR(9), '%') -- \t
OR `col` LIKE CONCAT('%', CHAR(10), '%') -- \n
OR `col` LIKE CONCAT('%', CHAR(13), '%') -- \r
OR `col` LIKE CONCAT('%', CHAR(160), '%') --
OR `col` LIKE CONCAT('%', CHAR(12288), '%'); -- 全形空格
REPLACE(逐個)或 REGEXP_REPLACE(8.0+)。TRIM 最語義化。