萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 去除字段空格完全指南:REPLACE、TRIM 與各類空白字元處理

為什麼 REPLACE(col, ' ', '') 還留有空格?

「空格」不只有 ASCII 32(0x20):

  • 全形空格 U+3000(中文輸入法下空格)
  • 不換行空格 U+00A0( )
  • 製表符 \t、換行 \n、換頁 \f、垂直製表 \v
  • 零寬空格 U+200B、細空格 U+2009 等 Unicode 空白字元

MySQL REPLACE 區分字元,僅替換完全匹配的字串。

方案一:REPLACE 逐個擊破(適用已知異常字元)

UPDATE `v9_news`
SET `description` = REPLACE(REPLACE(REPLACE(`description`, ' ', ''), CHAR(160), ''), CHAR(12288), '');
-- CHAR(160)=  CHAR(12288)=全形空格

技巧:從問題數據中 COPY 一個看不見的字元,直接粘貼進 SQL 字串字面值。

方案二:TRIM 系列——只除首尾

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),不支援正則或多字元集合。
  • 無法清除字串中間的空白。

方案三:正則替換(MySQL 8.0+ REGEXP_REPLACE)

UPDATE `t`
SET `col` = REGEXP_REPLACE(`col`, '[[:space:]]+', '')
WHERE `col` REGEXP '[[:space:]]';
  • [[:space:]] 涵蓋所有 Unicode 空白字元(需 8.0.4+)。
  • 5.7 需自寫 UDF 或應用層處理。

方案四:應用層預處理(推薦)

入庫前在代碼層統一規範化:

# 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 最語義化。
  • 源頭治理 > 事後清洗,建立「入庫必經正規化」規範。
copyright © 萬盛學電腦網 all rights reserved