Mengapa tipe integer yang tidak ditandai tersedia di platform basis data teratas?

15

Database biasanya sangat dapat disesuaikan dengan berbagai tipe data dan panjang kustom.

Ini mengejutkan saya, ketika saya mencoba mencari sintaks untuk menggunakan unsigned inttipe yang tidak tersedia dari PostgreSQL dan MS SQL Server. MySQL dan Oracle sepertinya.

Ini kelihatannya seperti kelalaian mencolok di pihak mereka - pilihan perfomant terbaik berikutnya menjadi long / bigint, (integer 8 byte), tetapi bisa benar-benar tidak perlu! Adakah yang tahu mengapa mereka memilih untuk tidak menyertakan dukungan int asli yang tidak ditandatangani?

Ehryk
sumber
2
Portable == mandat standar. Standar C tidak menentukan lebar int atau panjang biasa, hanya rentang minimum angka yang dapat diwakili. Platform dengan int 16bit adalah umum di beberapa titik. 64bit dimungkinkan. 36 juga (meskipun punah). 24 terjadi (DSP). Seberapa sering Anda memiliki data yang pas dalam 32bit tetapi tidak 31, dan Anda telah mengukur bahwa menggunakan tipe numerik biasa memberi Anda hit kinerja?
Mat
2
Baik SQL-Server maupun Postgres memiliki NUMERIC(10)yang memungkinkan bilangan bulat hingga 9.999.999.999(dan dengan batasan Anda dapat melarang nilai negatif.)
ypercubeᵀᴹ
4
Untuk satu alasan: mereka tidak ditentukan dalam standar SQL. Untuk diskusi yang lebih panjang mengenai Postgres, lihat diskusi ini: postgresql.1045698.n5.nabble.com/… dan ini: postgresql.1045698.n5.nabble.com/…
a_horse_with_no_name
2
Untuk SQL Server, ada sebuah penjelasan di sini
Martin Smith
1
@Mat Ini bukan kinerja hit saya khawatir, itu 4 byte ekstra x 153 juta = ~ 612 MB ekstra sia-sia, nilainya pergi di atas 3 miliar tetapi tidak 4 miliar. Seorang numerik (10) telah melakukan hit selain membutuhkan 9 byte penyimpanan: msdn.microsoft.com/en-us/library/ms187746.aspx
Ehryk

Jawaban:

14

Jim Hogg dari Microsoft telah merespons masalah ini dengan yang berikut:

Ada pro dan kontra. Di sisi pro, sepertinya cara yang baik untuk menghindari beberapa kesalahan - harus memeriksa int (ditandatangani) memiliki nilai> 0. Dan saya juga berani bahwa banyak penggunaan int sebenarnya berhubungan dengan jumlah yang seharusnya tidak boleh negatif pula . Pada pertanyaan tentang menggandakan jumlah baris maks? - benar, tapi saya akan mengatakan ini kurang menarik.

Di sisi kontra ... mencampur jenis yang ditandatangani / tidak ditandatangani dalam C atau C ++ sepertinya itu harus cukup sederhana. Ini bukan. Ini membuka sedikit kesalahan yang sulit ditemukan - sebagian besar disebabkan oleh aturan yang rumit untuk promosi / pelebaran tersirat. SQL, sayangnya, sudah memiliki seperangkat aturan casting implisit yang lebih kompleks. Menambahkan ints yang tidak ditandatangani, saya khawatir, akan membingungkan kita semua.

Saya akan menyimpan saran ini di buku-buku. Tetapi, di antara semua fitur yang dapat / seharusnya kita tambahkan, yang ini, dengan hormat, tidak berada di dekat bagian atas daftar itu.

Sumber: Microsoft Connect

Saya akan menambahkan secara signifikan ke daftar pro, dan menegaskan kembali bahwa mesin SQL mereka sudah melakukan JAUH hal-hal yang lebih kompleks dari ini, sehingga tim mereka dapat menangani kompleksitas yang ditambahkan. Meskipun saya tidak setuju dengan penjumlahan mereka, inilah sebabnya SQL Server tidak mendukung tipe yang tidak ditandatangani .

Tautan Connect awalnya diposting oleh Martin Smith dalam komentar pertanyaan.

Ehryk
sumber
3
"membingungkan kita semua bahkan lebih" - mungkin merujuk pada semua orang yang menggunakan SQL Server, bukan hanya tim pengembangan mereka sendiri.
Oskar Berggren