Mysql: Предоставьте типы uint32 и uint64

Созданный на 28 нояб. 2017  ·  7Комментарии  ·  Источник: go-sql-driver/mysql

Описание проблемы

При использовании обычного типа MySQL INT в качестве первичного ключа пользователи обычно создают тип с INT UNSIGNED который равен 32b unsigned int. Однако в базовом пакете db.sql такого типа нет.

Я обсуждал это на Reddit, и все предлагали написать такой тип. Однако мне кажется, что это должно быть в библиотеке для повторного использования. Я думаю, что это должно быть в этой библиотеке, поскольку это специфический для MySQL тип (размер в байтах), и я не думаю, что мы могли бы поместить его в пакет db.sql.

Я считаю, что структуры должны правильно представлять типы данных в MySQL, чтобы не было переполнения, которое могло бы произойти при использовании NullInt64 для сохранения данных в INT UNSIGNED . То же самое применяется при использовании BIGINT UNSIGNED - максимальное значение которого не помещается в NullInt64.

Пример кода

type MyTable struct {
    ID uint
}

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

Я мог бы создавать эти типы, я просто хотел спросить, прежде чем писать их, не возражаете ли вы, что они будут в этом пакете.
Спасибо.

databassql issue enhancement question

Самый полезный комментарий

@arnehormann было обсуждение этого в Go database / sql package github, где rsc сказал, что эта поддержка должна быть добавлена ​​специально в драйвер golang mysql (потому что не все базы данных поддерживают эти большие значения).

Смотрите здесь: https://github.com/golang/go/issues/9373

Все 7 Комментарий

Мы связаны https://golang.org/pkg/database/sql/driver/#Value - и драйвер обменивается данными с базой данных / sql в рамках этих ограничений. За исключением NullTime, которого не было в базе данных / sql, мы не будем добавлять дополнительные типы.

@arnehormann было обсуждение этого в Go database / sql package github, где rsc сказал, что эта поддержка должна быть добавлена ​​специально в драйвер golang mysql (потому что не все базы данных поддерживают эти большие значения).

Смотрите здесь: https://github.com/golang/go/issues/9373

Да, он написал:
`` Существуют базы данных (например, sqlite), которые не поддерживают такие большие значения.
Вот почему база данных / sql не допускает этого по умолчанию.
Мы не можем изменить это решение сейчас, потому что оно нарушит все существующие драйверы.

Если MySQL поддерживает такие большие значения, драйвер MySQL может
реализация driver.Stmt реализовать driver.ColumnConverter и разрешить
uint64s в настраиваемом ValueConverter.

То есть драйвер MySQL, который хочет разрешить большие uint64, может сделать это сегодня.
В базе данных / sql не требуется изменение кода.
`` ''

Я согласен, это необходимо, особенно для uint32, а не для uint64, потому что вероятность переполнения uint64 в ближайшее время невелика.
Как мы этого добиваемся? Я готов помочь с созданием запроса на перенос для этого.

Мы уже поддерживаем uint64.

Мы уже поддерживаем uint64.

Но не NullUint64, который следует использовать для поля BIGINT UNSIGNED, допускающего значение NULL.
Вместо этого необходимо использовать NullInt64, что может вызвать переполнение.

Вы упомянули комментарий rsc о uint64, поэтому я ответил, что он уже реализован, как предлагал rsc.
Если вы предлагаете NullUint64 вместо uint64, скажите об этом, не упоминая комментарий rsc. Это просто сбивает с толку.

Мы уже поддерживаем uint64.

Но не NullUint64, который следует использовать для поля BIGINT UNSIGNED, допускающего значение NULL.
Вместо этого необходимо использовать NullInt64, что может вызвать переполнение.

Я создал пакет, который решает такую ​​проблему

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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги