Pertanyaan Mengapa mentransmisikan / mengonversi dari int menghasilkan tanda bintang


Seseorang baru-baru ini menanyakan saya pertanyaan ini dan saya pikir saya akan mempostingnya di Stack Overflow untuk mendapatkan beberapa masukan.

Sekarang jelas kedua skenario berikut ini seharusnya gagal.

# 1:

DECLARE @x BIGINT
SET @x = 100
SELECT CAST(@x AS VARCHAR(2))

Kesalahan yang jelas:

Msg 8115, Level 16, Negara 2, Jalur 3
  Kesalahan overflow aritmatika mengubah ekspresi menjadi tipe data varchar.

# 2:

DECLARE @x INT
SET @x = 100
SELECT CAST(@x AS VARCHAR(2))

Tidak jelas, ia mengembalikan * (Orang akan berharap ini menjadi luapan aritmatika juga ???)


Sekarang pertanyaan saya yang sebenarnya adalah, mengapa ??? Apakah ini hanya dengan desain atau ada sejarah atau sesuatu menyeramkan di balik ini?

Saya melihat beberapa situs dan tidak mendapatkan jawaban yang memuaskan.

misalnya http://beyondrelational.com/quiz/sqlserver/tsql/2011/questions/Why-does-CAST-function-return-an-asterik--star.aspx

http://msdn.microsoft.com/en-us/library/aa226054(v=sql.80).aspx

Harap dicatat saya tahu / memahami bahwa ketika sebuah integer terlalu besar untuk dikonversi ke string berukuran tertentu yang akan "dikonversi" menjadi tanda bintang, ini adalah jawaban yang jelas dan saya berharap saya dapat menurunkan semua orang yang terus memberikan jawaban ini . Saya ingin tahu mengapa tanda bintang digunakan dan bukan pengecualian yang dilempar, mis. alasan historis dll ??


32
2018-02-03 05:20


asal


Jawaban:


Untuk lebih menyenangkan lagi, coba yang ini:

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

:)


Jawaban atas pertanyaan Anda adalah: "Alasan historis"

Datatypes INT dan VARCHAR lebih tua dari BIGINT dan NVARCHAR. Banyak lebih tua. Faktanya mereka ada di asli Spesifikasi SQL. Juga lebih tua adalah pendekatan pengecualian-menekan mengganti output dengan tanda bintang.

Kemudian, orang-orang SQL memutuskan bahwa melemparkan kesalahan lebih baik / lebih konsisten, dll daripada mengganti string keluaran palsu (dan biasanya membingungkan). Namun demi konsistensi, mereka mempertahankan perilaku sebelumnya untuk kombinasi tipe data yang sudah ada sebelumnya (agar tidak merusak kode yang ada).

Jadi (banyak) kemudian ketika tipe data BIGINT dan NVARCHAR ditambahkan, mereka mendapat perilaku (er) baru karena mereka tidak dicakup oleh kakek yang disebutkan di atas.


30
2018-04-08 05:57



Anda dapat membaca di CAST dan CONVERT halaman pada bagian "Memotong dan Membulatkan Hasil". Int, smallint dan tinyint akan kembali * ketika panjang hasil terlalu pendek untuk ditampilkan ketika dikonversi ke char atau varchar. Angka lain ke konversi string akan mengembalikan kesalahan.


2
2018-02-21 05:23