2017-08-29 1267 views
1

我有一個varchar(18)列存儲這些值:'28412661022','2147483647'和'312231'。爲什麼整數值> 2147483647爲「varchar值溢出int列」錯誤?

當我執行此查詢時:SELECT * FROM TABLE WHERE COLUMN=28412661022,查詢成功完成。但是,當我執行此查詢:SELECT * FROM TABLE WHERE COLUMN=2147483647,我得到預期的「varchar值的轉換'28412661022'溢出int列」錯誤。

你知道這是爲什麼嗎? 28412661022> 2147483647,我相信這是SQL Server的最大允許整數。

+1

因爲隱式轉換爲'bigint'的。 **更正 - 數字 – SqlZim

+1

看看這裏: https://stackoverflow.com/questions/13297547/sql-server-and-implicit-conversion-of-types – Egbert

+0

你能詳細說明嗎?我不關注隱式轉換如何在一種情況下工作,而不是在另一種情況下工作。 – Avyncentia

回答

0

測試表:

create table t (col varchar(18)) 
insert into t values ('2147483647'),('28412661022') 

如果你的價值是能夠隱式轉換爲默認int你從價值'28412661022'得到一個錯誤:

select * 
from t 
where col>1 

The conversion of the varchar value '28412661022' overflowed an int column.


select * 
from t 
where col>28412661021 

返回:28412661022


如果指定的數字大於最大int更大,它會使用適合你的價值最小的numericdecimal數據類型。如果精度/規模是不夠的,你可以得到下面的錯誤表中所有的值:

select * 
from t 
where col>2147483648 

Error(s), warning(s): Arithmetic overflow error converting varchar to data type numeric.

+0

我想我明白了。在第一個例子中('col col> 1'),這兩個數據類型是varchar(來自列定義)和int(來自where子句)。 Int具有更高的優先級,所以我們嘗試將所有內容都轉換爲int。這不適用於28412661022. 在第二個示例中,28412661021是bigint,而不是int,因此我們將varchar值轉換爲bigint。這工作。 在第三個示例中,我們再次嘗試將varchar值轉換爲int。 – Avyncentia

+0

@Avyncentia請務必查看Egbert在其評論中發佈的鏈接:[SQL Server和類型的隱式轉換](https://stackoverflow.com/q/13297547/2333499) – SqlZim

相關問題