Mysql: Menyediakan tipe uint32 dan uint64

Dibuat pada 28 Nov 2017  ·  7Komentar  ·  Sumber: go-sql-driver/mysql

Deskripsi masalah

Saat menggunakan tipe INT MySQL biasa sebagai kunci utama, pengguna biasanya membuat tipe dengan INT UNSIGNED yang merupakan 32b unsigned int. Namun tidak ada tipe seperti itu dalam paket db.sql dasar.

Saya membahas ini di reddit dan semua orang menyarankan untuk menulis jenis ini. Namun menurut saya ini harus ada di perpustakaan untuk digunakan kembali. Saya pikir itu harus ada di perpustakaan ini, karena ini adalah tipe khusus MySQL (ukuran byte) dan saya rasa kita tidak bisa mendorongnya ke paket db.sql.

Saya percaya struct harus benar mewakili tipe data di MySQL sehingga tidak ada overflow, yang akan terjadi saat menggunakan NullInt64 untuk menyimpan data menjadi INT UNSIGNED . Hal yang sama berlaku saat menggunakan BIGINT UNSIGNED - yang nilai maksimumnya tidak akan cocok dengan NullInt64.

Kode contoh

type MyTable struct {
    ID uint
}

type MyOtherTable struct {
    ID uint
    MyTableID mysql.NullUint32 // Nullable relationship with MyTable
}

Saya dapat membuat jenis ini, saya hanya ingin bertanya sebelum menulisnya apakah Anda setuju dengan mereka dalam paket ini.
Terima kasih.

databassql issue enhancement question

Komentar yang paling membantu

@arnehormann ada diskusi tentang ini di Go database / sql package github, di mana rsc mengatakan dukungan ini harus ditambahkan di driver mysql golang secara khusus (karena tidak semua database mendukung nilai-nilai besar ini).

Lihat di sini: https://github.com/golang/go/issues/9373

Semua 7 komentar

Kami terikat oleh https://golang.org/pkg/database/sql/driver/#Value - dan driver berkomunikasi dengan database / sql dalam batasan ini. Kecuali untuk NullTime yang tidak ada di database / sql, kami tidak akan menambahkan tipe tambahan.

@arnehormann ada diskusi tentang ini di Go database / sql package github, di mana rsc mengatakan dukungan ini harus ditambahkan di driver mysql golang secara khusus (karena tidak semua database mendukung nilai-nilai besar ini).

Lihat di sini: https://github.com/golang/go/issues/9373

Ya, dia menulis:
`` Ada database (misalnya sqlite) yang tidak mendukung nilai sebesar itu.
Itulah mengapa database / sql tidak mengizinkan ini secara default.
Kami tidak dapat mengubah keputusan itu sekarang, karena itu akan merusak semua pengemudi yang ada.

Jika MySQL mendukung nilai yang begitu besar, maka driver MySQL dapat membuatnya
implementasi driver.Stmt mengimplementasikan driver.ColumnConverter dan memungkinkan
uint64s di ValueConverter kustom.

Artinya, driver MySQL yang ingin mengizinkan uint64 besar dapat melakukannya hari ini.
Tidak ada perubahan kode yang diperlukan dalam database / sql.
``

Saya setuju, ini diperlukan, bahkan yang lebih penting untuk uint32 daripada uint64, karena uint64 kecil kemungkinannya untuk meluap dalam waktu dekat.
Bagaimana kita mewujudkannya? Saya bersedia membantu membuat permintaan tarik untuk ini.

Kami sudah mendukung uint64.

Kami sudah mendukung uint64.

Tapi bukan NullUint64, yang harus digunakan untuk bidang nullable BIGINT UNSIGNED.
Perlu menggunakan NullInt64 sebagai gantinya, yang dapat memicu overflow.

Anda menyebutkan komentar rsc tentang uint64 jadi saya menjawab itu sudah diterapkan seperti yang disarankan rsc.
Jika Anda mengusulkan NullUint64 daripada uint64, katakan tanpa menyebutkan komentar rsc. Itu hanya membingungkan.

Kami sudah mendukung uint64.

Tapi bukan NullUint64, yang harus digunakan untuk bidang nullable BIGINT UNSIGNED.
Perlu menggunakan NullInt64 sebagai gantinya, yang dapat memicu overflow.

Saya membuat paket yang memecahkan masalah semacam itu

https://github.com/Thor-x86/nullable

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

zhaohui-kevin picture zhaohui-kevin  ·  5Komentar

pedromorgan picture pedromorgan  ·  6Komentar

albrow picture albrow  ·  7Komentar

PingGao89 picture PingGao89  ·  3Komentar

mayurshivakumar picture mayurshivakumar  ·  5Komentar