未加引號的識別碼(表名、欄位名等)僅允許:
執行 CREATE TABLE testname (a1 INT),LIST TABLES 顯示為 TESTNAME——預設一律大寫。
解法:雙引號括住識別碼,使其成為「分隔識別碼」,保留原始大小寫並允許任意字元(含空格、國際字元)。
-- 建立含大小寫表名
db2 create table "TestName" (col1 int)
-- 建立含 $ 特殊字元
db2 create table "Test$Name" (col1 int)
-- 後續 DML 同樣需加引號
db2 insert into "Test$Name" values (1), (2)
db2 select * from "Test$Name"
Shell 會解析 $、`、! 等元字元,需雙重轉義:
-- 外層雙引號保護 SQL 字串,內層反斜線轉義 $ 避免 Shell 展開
db2 "create table \"Test\$Name\" (col1 int)"
-- DML 同理
db2 "insert into \"Test\$Name\" values (1), (2)"
db2 "select * from \"Test\$Name\""
核心原則:SQL 層面用雙引號界定識別碼;Shell 層面用引號/轉義保護 SQL 字串不被預處理。
| 字元 | Windows | UNIX/Linux | 備註 |
|---|---|---|---|
| 空格 | "My Table" | "\"My Table\"" | 建議避免使用 |
| $ | "Test$Name" | "\"Test\$Name\"" | Shell 變數前綴 |
| # | "Test#Name" | "\"Test#Name\"" | Shell 註解開頭 |
| ` | "Test`Name" | "\"Test\`Name\"" | 命令替換 |
| ! | "Test!Name" | "\"Test\!Name\"" | 歷史擴展 |
db2 -tf script.sql 執行,避免命令列轉義地獄。掌握分隔識別碼與跨平台轉義,讓表名命名自由度不再受限於平台差異。