DB2 中若直接在字串字面值內出現單引號、反斜線等特殊字元,會導致 SQL 剖析錯誤。DB2 提供 @# ... @# 包裹語法 作為通用轉義機制:欲插入的特殊字元置於 @# 與 @# 之間,資料庫引擎會自動解碼為實際字元並寫入資料行。
| # | 目標字元 | 單純插入範例 | 混合字串範例 |
|---|---|---|---|
| 1 | 單引號 ' | INSERT INTO t VALUES('@#''@#'); | INSERT INTO t VALUES('@#A''B@#'); |
| 2 | 波浪號 ~ | INSERT INTO t VALUES('@#~@#'); | INSERT INTO t VALUES('@#A~B@#'); |
| 3 | 驚嘆號 ! | INSERT INTO t VALUES('@#!@#'); | INSERT INTO t VALUES('@#A!B@#'); |
| 4 | At 符號 @ | INSERT INTO t VALUES('@#@@#'); | INSERT INTO t VALUES('@#A@B@#'); |
| 5 | 井號 # | INSERT INTO t VALUES('@##@#'); | INSERT INTO t VALUES('@#A#B@#'); |
| 6 | 美元符 $ | INSERT INTO t VALUES('@#$@#'); | INSERT INTO t VALUES('@#A$B@#'); |
| 7 | 百分號 % | INSERT INTO t VALUES('@#%@#'); | INSERT INTO t VALUES('@#A%B@#'); |
| 8 | 插入符 ^ | INSERT INTO t VALUES('@#^@#'); | INSERT INTO t VALUES('@#A^B@#'); |
| 9 | AND 符 & | INSERT INTO t VALUES('@#&@#'); | INSERT INTO t VALUES('@#A&B@#'); |
| 10 | 星號 * | INSERT INTO t VALUES('@#*@#'); | INSERT INTO t VALUES('@#A*B@#'); |
| 11 | 左括號 ( | INSERT INTO t VALUES('@#(@#'); | INSERT INTO t VALUES('@#A(B@#'); |
| 12 | 右括號 ) | INSERT INTO t VALUES('@#)@#'); | INSERT INTO t VALUES('@#A)B@#'); |
| 13 | 底線 _ | INSERT INTO t VALUES('@#_@#'); | INSERT INTO t VALUES('@#A_B@#'); |
| 14 | 減號 - | INSERT INTO t VALUES('@#-@#'); | INSERT INTO t VALUES('@#A-B@#'); |
| 15 | 加號 + | INSERT INTO t VALUES('@#+@#'); | INSERT INTO t VALUES('@#A+B@#'); |
| 16 | 等號 = | INSERT INTO t VALUES('@#=@#'); | INSERT INTO t VALUES('@#A=B@#'); |
| 17 | 斜線 / | INSERT INTO t VALUES('@#/@#'); | INSERT INTO t VALUES('@#A/B@#'); |
| 18 | 小於號 < | INSERT INTO t VALUES('@#<@#'); | INSERT INTO t VALUES('@#A<B@#'); |
| 19 | 大於號 > | INSERT INTO t VALUES('@#>@#'); | INSERT INTO t VALUES('@#A>B@#'); |
| 20 | 問號 ? | INSERT INTO t VALUES('@#?@#'); | INSERT INTO t VALUES('@#A?B@#'); |
| 21 | 冒號 : | INSERT INTO t VALUES('@#:@#'); | INSERT INTO t VALUES('@#A:B@#'); |
| 22 | 分號 ; | INSERT INTO t VALUES(CHR(59)); | INSERT INTO t VALUES('A' || CHR(59) || 'B'); |
| 23 | 雙 @#(轉義包裹符本身) | INSERT INTO t VALUES('@#@#@#@#'); | INSERT INTO t VALUES('@#A@#@#@#B@#'); |
| 24 | 反引號 ` | INSERT INTO t VALUES('@#`@#'); | INSERT INTO t VALUES('@#A`B@#'); |
| 25 | 管線符 | | INSERT INTO t VALUES('@#|@#'); | INSERT INTO t VALUES('@#A|B@#'); |
| 26 | 反斜線 \ | INSERT INTO t VALUES('@#\\@#'); | INSERT INTO t VALUES('@#A\\B@#'); |
| 27 | 左大括號 { | INSERT INTO t VALUES('@#{@#'); | INSERT INTO t VALUES('@#A{B@#'); |
| 28 | 右大括號 } | INSERT INTO t VALUES('@#}@#'); | INSERT INTO t VALUES('@#A}B@#'); |
| 29 | 方括號 [ ] | INSERT INTO t VALUES('@#[@#'); | INSERT INTO t VALUES('@#A[B@#'); |
; 特例:因 ; 是 SQL 陳述式終結符,無法直接置於 @# 內,必須改用 CHR(59) 函式或連接運算子 || 組合。@#,需雙寫轉義:@#@#@#@#(外層包裹 + 內層雙寫)。INSERT INTO t VALUES(?)),由驅動程式自動處理轉義,避免手工拼接 SQL 帶來的注入風險與維護負擔。CHR() 通用替代方案:任何可列印/不可列印 ASCII 字元均可用 CHR(ascii_code) 表示,如 CHR(9) (Tab)、CHR(10) (LF)、CHR(13) (CR)。-- 假設 CSV 欄位以 | 分隔,資料可能含單引號、逗號等
LOAD FROM data.csv OF DEL MODIFIED BY CHARDEL@#|@#
METHOD P(1, 2, 3)
MESSAGES load.msg
INSERT INTO target_table (col1, col2, col3)
NONRECOVERABLE;
掌握 @#...@# 包裹語法與 CHR() 函式,配合參數化查詢最佳實踐,即可從容應對 DB2 中任何特殊字元的插入與處理需求。