sql >> Databasteknik >  >> RDS >> Sqlserver

Varför cast/konvertera från int returnerar en asterisk

För ännu roligare, prova den här:

DECLARE @i INT
SET @i = 100
SELECT CAST(@i AS VARCHAR(2)) -- result: '*'
go

DECLARE @i INT
SET @i = 100
SELECT CAST(@i AS NVARCHAR(2)) -- result: Arithmetic overflow error

:)

Svaret på din fråga är:"Historiska skäl"

Datatyperna INT och VARCHAR är äldre än BIGINT och NVARCHAR. Mycket äldre. Faktum är att de är i originalet SQL-specifikationer. Äldre är också det undantagsundertryckande tillvägagångssättet att ersätta utdata med asterisker.

Senare bestämde SQL-folket att det var bättre/mer konsekvent att kasta ett fel, etc. än att ersätta falska (och vanligtvis förvirrande) utdatasträngar. Men för konsekvensens skull behöll de det tidigare beteendet för de redan existerande kombinationerna av datatyper (för att inte bryta befintlig kod).

Så (mycket) senare när BIGINT- och NVARCHAR-datatyperna lades till, fick de det nya(re) beteendet eftersom de inte omfattades av den farfar som nämns ovan.



  1. Rätt sätt att hantera dubbelriktad 1:m i Green-DAO

  2. Observer Overhead- och väntetypssymptom

  3. Hur kan jag få tidig tillgång till Oracle Java-uppdateringar, så att jag kan testa min RIA och undvika brandövningar när dessa uppdateringar görs offentliga?

  4. PostgreSQL-borttagning med inre koppling