Pertimbangkan dua pernyataan berikut:
PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0);
Kedua pernyataan kembali -1
; bukankah itu salah karena nilai biner kedua adalah desimal 65.536 lebih tinggi dari nilai pertama, bukan?
Tentunya ini bukan karena pemotongan diam?
Jika saya menjalankan pernyataan berikut:
PRINT CONVERT(NUMERIC(38, 0), 0x00000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x00010001, 0);
Saya disajikan dengan kesalahan berikut:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varbinary to numeric.
Bagaimana saya bisa mendiagnosis apa yang terjadi di sini?
Saya menjalankan ini pada SQL Server 2012, v11.0.5058. Hasilnya sama pada SQL Server 2008 R2 SP2, SQL Server 2005, dan SQL Server 2000.
sql-server
sql-server-2008
sql-server-2012
Max Vernon
sumber
sumber
SELECT CONVERT(VARBINARY(32), 1), CONVERT(VARBINARY(32), 1.0);
PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00000001), 0); PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00010001), 0);
.Jawaban:
Bilangan desimal dan bilangan bulat dikodekan sangat berbeda dalam varbinary. Desimal membutuhkan lebih banyak ruang. Mencoba:
Adapun tujuan akhir Anda, menyimpan bilangan bulat sebagai varbinary untuk menghemat ruang, saya pikir Anda telah menjawab pertanyaan itu sendiri - tidak sepadan.
sumber