2017-04-21 22 views
1

我有一個表定義爲如何避免MySQL警告#1265。數據截斷列...,當在默認NULL列表上插入空字符串?

CREATE TABLE `flagged` (
    `id` int(4) DEFAULT NULL, 
    `flag` ENUM('A','B') DEFAULT NULL 
); 

當執行

INSERT INTO `flagged` VALUES (1,'A'),(2,'B'),(3,NULL),(4,''); 

我得到以下警告:

Query OK, 4 rows affected, 1 warning (0.02 sec) 
Records: 4 Duplicates: 0 Warnings: 1 

Warning (Code 1265): Data truncated for column 'flag' at row 4 

鑑於該數據是備份的結果(相當大的一個),我不能輕易操縱INSERT命令。

我想避免這種特殊情況的報告,但仍會收到任何其他可能出現的問題的警告。

+0

您的'ENUM'不允許使用空字符串。也許它被壓縮到'NULL'? – tadman

+0

**無聲**壓扁到'NULL'將是我的預期行爲。 但它既不沉默也不被壓縮爲NULL,但被接受。我懷疑原始數據庫是允許那些空的非空值,然後導致這些警告。 –

+0

MySQL過去曾經默默地做過很多事情,但是更新的版本已經開始將這些事情表現爲警告和錯誤。這取決於您的服務器設置,並且一些默認設置被設置爲更嚴格。很多人對MySQL非常鄙視,因爲它會默默地做這樣的事情,沒有任何警告,最終會摧毀大量的數據。最好不要被警告和忽略,否則永遠不會知道它要做什麼。 – tadman

回答

0

MySQL的枚舉數據類型可以具有2 different empty (not null) value

  1. 一個普通的一個在允許的一個(可選)列出

  2. 指示不正確的值插入到該字段的誤差值。這是枚舉數據類型的內在行爲。

區分兩個空值的唯一方法是索引:錯誤空值具有索引0;常規值將具有非零值。

在你的情況下,普通的枚舉列表不包含空值,並且嚴格的sql模式被關閉。因此,當你在枚舉中插入一個空值時,mysql檢測到它不在列表中。由於嚴格sql模式被關閉,mysql只會引發警告,並將該值設置爲錯誤的空字符串(索引0)。您可以通過在查詢中將枚舉值轉換爲int來輕鬆檢查。

您有2個選項可以專門去除這些警告。這兩個選項都有缺點,所以你應該仔細考慮你做了什麼。你甚至可以決定只留下警告(這是我會做的)。

  1. 將空字符串添加到枚舉的列表中。缺點是空值的索引號會改變,並可能干擾枚舉字段上的任何排序或篩選。

  2. 在插入觸發器之前使用將空值轉換爲空值。同樣,這可能會干擾任何分類或篩選,並且可能會減慢導入過程。

必須檢查空值是如何在源系統處理,如果應用程序有將被選擇的方法會影響任何疑問,必須進行評估。

相關問題