Saya tahu bahwa tipe data NUMERIC dan DECIMAL di SQL Server berfungsi sama: sintaks untuk membuatnya adalah sama, rentang nilai yang dapat Anda simpan di dalamnya sama, dll.
Namun, dokumentasi MSDN menjelaskan hubungan antara keduanya karena ini:
numerik secara fungsional setara dengan desimal.
Biasanya, ketika saya melihat kualifikasi " setara secara fungsional ", itu berarti bahwa dua hal tidak persis sama, tetapi mereka adalah dua jenis berbeda yang tidak dapat dibedakan dari luar .
Apakah implikasi ini benar? Apakah ada perbedaan antara NUMERIC dan DECIMAL yang kebetulan berperilaku sama dengan pengamat luar? Atau apakah mereka sebenarnya setara, misalnya apakah NUMERIC hanya sinonim warisan untuk DECIMAL?
sql-server
KutuluMike
sumber
sumber
Jawaban:
Mereka sebenarnya setara, tetapi mereka adalah tipe independen, dan bukan sinonim secara teknis , seperti
ROWVERSION
danTIMESTAMP
- meskipun mereka mungkin telah disebut sebagai sinonim dalam dokumentasi pada satu waktu . Itu adalah arti sinonim yang sedikit berbeda (misalnya mereka tidak dapat dibedakan kecuali dalam nama, tidak satu alias alias untuk yang lain). Ironis kan?Apa yang saya tafsirkan dari kata-kata dalam MSDN sebenarnya:
Selain
type_id
nilainya, semuanya di sini identik:Saya sama sekali tidak memiliki pengetahuan tentang perbedaan perilaku antara keduanya, dan kembali ke SQL Server 6.5, selalu memperlakukan mereka sebagai 100% dipertukarkan.
Hanya jika Anda melakukannya secara eksplisit. Anda dapat membuktikan ini dengan mudah dengan membuat tabel dan kemudian memeriksa rencana kueri untuk kueri yang melakukan eksplisit atau - Anda mungkin mengharapkan - konversi tersirat. Ini tabel sederhana:
Sekarang jalankan pertanyaan ini dan tangkap rencana:
Seperti yang ditunjukkan dalam SQL Sentry Plan Explorer *, paket tersebut tidak terlalu menarik:
Tetapi tab Ekspresi yakin adalah:
Seperti yang saya komentari di atas, kami memiliki konversi eksplisit tempat kami memintanya, tetapi tidak ada konversi eksplisit di mana kami mungkin mengharapkannya. Tampaknya pengoptimal memperlakukan mereka juga dapat dipertukarkan.
Silakan dan coba tes ini juga (data dan indeks).
Sekarang jalankan query ini:
Plan tidak memiliki konversi (sebenarnya tab Ekspresi kosong):
Bahkan ini tidak mengarah pada konversi yang tidak terduga. Tentu saja Anda melihatnya di RHS dalam predikat, tetapi dalam kasus apa pun konversi tidak boleh terjadi terhadap data kolom untuk memfasilitasi pencarian (apalagi memaksa pemindaian).
Secara pribadi, saya lebih suka menggunakan istilah ini
DECIMAL
hanya karena jauh lebih akurat dan deskriptif.BIT
juga "numerik".sumber
Mereka identik dalam praktiknya, namun (dari standar SQL 2003):
21) NUMERIC menentukan tipe data numerik yang tepat, dengan presisi desimal dan skala yang ditentukan oleh
precision
danscale
.22) DECIMAL menentukan tipe data numerik yang tepat, dengan skala desimal yang ditentukan oleh
scale
dan presisi desimal yang ditentukan implementasi sama dengan atau lebih besar dari nilai yang ditentukanprecision
.sumber