首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL INSERT 語句中 NULL 值處理陷阱:工具導出 '[NULL]' 字符串導致語法錯誤 1064

     編輯:MySQL 綜合教學

現象

某工具導出的 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]'
);

根因分析

  1. [NULL] 是字符串,而非 SQL NULL 值:工具將數據庫 NULL 導出為字面字符串 '[NULL]',插入時會嘗試寫入這 6 個字符,而非「空值」。
  2. 語法錯誤:INSERT INTO storehouseindtl(...) 缺少 VALUES 關鍵字(原文 insert to),且結尾缺少分號。
  3. 類型不匹配風險:若目標列為 INT、DATE、DECIMAL,插入字符串 '[NULL]' 會觸發隱式轉換或報錯。

正確的 NULL 表示

修正後的語句

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 的最佳實踐

  1. 導出為無引號 NULL:如 mysqldump 默認行為。
  2. 區分空串與 NULL:'' 導出為 '',NULL 導出為 NULL。
  3. 字段列表與 VALUES 列數嚴格對應:避免隱式插入導致列錯位。
  4. 語法完整性: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 掃描異常模式、再小樣本試導入**,養成「不信任、必驗證」習慣,避免垃圾數據污染生產庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景正確寫法錯誤寫法
SQL 語句中NULL(無引號、大小寫不敏感)'NULL'、'[NULL]'、''
字符串列允許空NULL''(空串 ≠ NULL)
數值/日期列允許空NULL0、'0000-00-00'(業務語義不同)