2010-11-19 33 views
2

我有一些MySQL代碼:MySQL的錯誤代碼:1264超範圍值的列「計數」在第1行

CREATE TABLE test_table ( 
    id int(11) NOT NULL AUTO_INCREMENT, 
    count int(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (id) 
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1; 

insert into test_table (count) values (1); 
update test_table set count = IF(count -1 < 0, 0 , count -1); 
update test_table set count = IF(count -1 < 0, 0 , count -1); 

這應該設置如果(count -1) < 0計數到零。

我得到一個錯誤:

Error Code: 1264 Out of range value for column 'count' at row 1` instead. 

這是由於數是一個unsigned int。如果我使用一個有符號的整數它的作品。

這是MySQL中的錯誤嗎?我使用的是:mysql Ver 14.14 Distrib 5.1.46sp1, for Win32 (ia32)

+0

這不是一個錯誤 http://bugs.mysql.com/bug.php?id=2454 – 2011-09-19 03:50:20

回答

5

,我認爲你應該這樣做:

UPDATE test_table 
SET count = IF(count < 1, 0 , count -1) 

count - 1下溢值時count爲零。

 
SELECT count, count - 1 FROM test_table; 
+-------+----------------------+ 
| count | count - 1   | 
+-------+----------------------+ 
| 0  | 18446744073709551615 | 
| 1  |     0 | 
| 2  |     1 | 
+-------+----------------------+ 

當我嘗試查詢時,它不起作用...但它不會以與您看到的相同的方式失敗。

+0

我仍然沒有看到任何理由,它會失敗。如果(count -1)有符號且大於零,那麼在分配給count之前,它必須轉換爲unsigned int。因爲我從來沒有分配過任何小於零的數字,如果測試失敗,只是零,這應該是相同的。超過解決方案。我的問題在於,-1只是一個例子,實際上可以是任何整數X.我可以做IF(count Polymorphix 2010-11-19 12:12:03

+0

編輯:需要考慮標誌太:如果(計數 Polymorphix 2010-11-19 12:18:04

+0

謝謝!所以它顯然是用無符號整數進行算術運算。我想是有道理的。過於習慣於在飛行中自動完成類型轉換的編程。 – Polymorphix 2010-11-19 12:22:30

1

如果count是無符號的,並且它的值爲零,那麼從它減去1會給出一個超出unsigned int範圍的值。所以正確的錯誤信息和沒有錯誤,我認爲

+0

但我沒有把價值分配給現場。只是將其用作測試的一部分。 – Polymorphix 2010-11-19 12:18:45

+0

在測試中,當計數爲零時,您正試圖計算count -1。這是一個無效計算,因爲無符號值無法表示計數 - 1. Mark Byers有正確的想法 - 儘量不要使用負值。 – 2010-11-19 12:26:02

相關問題