現象
某工具導出的 INSERT 語句執行報錯:
MySQL Error Code: 1064
語句片段:
INSERT INTO storehouseindtl (...) VALUES (
'020011007210000002', '1007210002', '01', '1201110000007', '01',
'[NULL]', '43102208', '2', '02', '13', '[NULL]', '[NULL]', '600',
'[NULL]', '0.0', '[NULL]', '[NULL]', '[NULL]', '2012-01-02',
'[NULL]', '[NULL]', '[NULL]', '[NULL]', '600', '[NULL]', '00',
'[NULL]', '14:49:13 ', '[NULL]', '2012-01-11', '[NULL]', '[NULL]'
);
根因分析
[NULL] 是字符串,而非 SQL NULL 值:工具將數據庫 NULL 導出為字面字符串 '[NULL]',插入時會嘗試寫入這 6 個字符,而非「空值」。
- 語法錯誤:
INSERT INTO storehouseindtl(...) 缺少 VALUES 關鍵字(原文 insert to),且結尾缺少分號。
- 類型不匹配風險:若目標列為
INT、DATE、DECIMAL,插入字符串 '[NULL]' 會觸發隱式轉換或報錯。
正確的 NULL 表示
| 場景 | 正確寫法 | 錯誤寫法 |
| SQL 語句中 | NULL(無引號、大小寫不敏感) | 'NULL'、'[NULL]'、'' |
| 字符串列允許空 | NULL | ''(空串 ≠ NULL) |
| 數值/日期列允許空 | NULL | 0、'0000-00-00'(業務語義不同) |
修正後的語句
INSERT INTO `storehouseindtl` (
`ENTERNO`, `WAREHOUSENO`, `STOREHOUSENO`, `INNO`, `INTP`, `INBILLNO`,
`PRODENTERID`, `PRODLVL`, `BIGVARIETY`, `SMALLVARIETY`, `SPECIFICATION`,
`PIECE`, `BOXES`, `PRICE`, `TOTALAMT`, `PRODDT`, `VALIDDT`, `ENDDT`,
`INDT`, `KEEPERIDCARD`, `FROMWAREHOUSENO`, `FROMSTOREHOUSENO`,
`FROMRETAILENTERNO`, `CURBOXES`, `BULKCARGOBILLNO`, `ISREPORT`,
`REPORTTIME`, `INTABLETM`, `IDCARD`, `FILLDATE`, `BARCODEVALUE`, `MEMO`
) VALUES (
'020011007210000002', '1007210002', '01', '1201110000007', '01',
NULL, '43102208', '2', '02', '13', NULL, NULL, '600',
NULL, '0.0', NULL, NULL, NULL, '2012-01-02',
NULL, NULL, NULL, NULL, '600', NULL, '00',
NULL, '14:49:13', NULL, '2012-01-11', NULL, NULL
);
工具導出 NULL 的最佳實踐
- 導出為無引號
NULL:如 mysqldump 默認行為。
- 區分空串與 NULL:
'' 導出為 '',NULL 導出為 NULL。
- 字段列表與 VALUES 列數嚴格對應:避免隱式插入導致列錯位。
- 語法完整性:
INSERT INTO tbl (cols) VALUES (...); 關鍵字大寫、有分號。
自查清單:收到第三方 SQL 文件如何驗證?
# 1. 檢查是否包含 '[NULL]'、'NULL' 等字符串
grep -n "\[NULL\]" dump.sql
grep -n "'NULL'" dump.sql
# 2. 檢查 INSERT 語法完整性
head -20 dump.sql | grep -E "^INSERT INTO"
# 3. 小樣本試導入
head -100 dump.sql | mysql -u test -p test_db 2>&1 | head -20
結語
[NULL] 字符串偽裝 NULL 是**劣質導出工具的典型特徵**,會導致語法錯誤、類型錯誤、業務語義錯誤。標準 SQL NULL 寫作 NULL(無引號)。收到第三方 SQL 文件,**先 grep 掃描異常模式、再小樣本試導入**,養成「不信任、必驗證」習慣,避免垃圾數據污染生產庫。
- 上一篇文章: Ubuntu 命令行下 MySQL 數據導出導入實戰:mysqldump 與 source 命令全場景示例
- 下一篇文章: MySQL 修改默認字符集為 UTF8/UTF8MB4:my.cnf 配置與驗證全流程
Copyright ©
程式碼之家 All Rights Reserved