Mysql: 提供uint32和uint64类型

创建于 2017-11-28  ·  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数据库/ sql软件包github中对此进行了讨论,其中rsc表示应在golang mysql驱动程序中特别添加此支持(因为并非所有数据库都支持这些大值)。

看到这里: https :

所有7条评论

我们受https://golang.org/pkg/database/sql/driver/#Value的约束-驱动程序在这些限制内与数据库/ sql通信。 除了数据库/ sql中缺少的NullTime外,我们不会添加其他类型。

@arnehormann在Go数据库/ sql软件包github中对此进行了讨论,其中rsc表示应在golang mysql驱动程序中特别添加此支持(因为并非所有数据库都支持这些大值)。

看到这里: https :

是的,他写道:
``有些数据库(例如sqlite)不支持这么大的值。
这就是为什么数据库/ SQL默认情况下不允许这样做的原因。
我们现在无法更改该决定,因为它将破坏所有现有驱动程序。

如果MySQL确实支持这么大的值,则MySQL驱动程序可以使其
driver.Stmt的实现实现driver.ColumnConverter并允许
自定义ValueConverter中的uint64s。

也就是说,想要允许大型uint64s的MySQL驱动程序今天可以这样做。
在数据库/ sql中不需要更改代码。
```

我同意,这是必需的,对于uint32而不是uint64来说更重要,因为uint64不太可能在短期内溢出。
我们如何做到这一点? 我愿意为此提供拉取请求。

我们已经支持uint64。

我们已经支持uint64。

但不是NullUint64,应将其用于BIGINT UNSIGNED可为空的字段。
需要使用NullInt64代替,这会触发溢出。

您提到了rsc关于uint64的评论,所以我回答说它已按照rsc的建议实施。
如果您提议使用NullUint64而不是uint64,请说出它而不提及rsc的注释。 这只是令人困惑。

我们已经支持uint64。

但不是NullUint64,应将其用于BIGINT UNSIGNED可为空的字段。
需要使用NullInt64代替,这会触发溢出。

我创建了一个解决此类问题的程序包

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

此页面是否有帮助?
0 / 5 - 0 等级