查詢條件 WHERE varchar_col = 'ABC123' 明明資料表中有該值,卻查無結果。欄位定義為 VARCHAR2(16),實際輸入僅 8 字元。
Oracle VARCHAR2 不會自動修剪尾部空格(異於 CHAR 會右補空格)。若資料寫入時帶有尾隨空格(如 ETL 匯入、手工輸入),查詢時未帶入相同空格即不匹配。
SELECT * FROM ttdltc012111
WHERE REPLACE(T$CLOT, ' ', '') = 'ABC123';
將欄位內所有空格移除後再比對,適用於資料中間可能也夾雜空格的情況。
SELECT * FROM ttdltc012221
WHERE T$CLOT = LPAD('ABC123', 16);
若確定資料為右對齊存放(前補空格),可將查詢值補齊至欄位定義長度再比對。
UPDATE ttdltc012111
SET T$CLOT = TRIM(T$CLOT)
WHERE T$CLOT != TRIM(T$CLOT);
一次性清除現有資料首尾空格,並建立 CHECK CONSTRAINT 或觸發器防止未來寫入帶空格資料。
TRIM 輸入值。BEFORE INSERT/UPDATE 觸發器自動 :NEW.col := TRIM(:NEW.col)。CHAR 型別或明確文件化規範。| 特性 | CHAR(n) | VARCHAR2(n) |
|---|---|---|
| 儲存方式 | 固定長度,右補空格 | 可變長度,不補空格 |
| 比較語意 | Blank-padded comparison(忽略尾部空格) | Non-padded comparison(精確比對含空格) |
| 適用場景 | 固定長度代碼(身分證、國碼) | 不定長度文字(姓名、地址、描述) |