Mysql: 无法将空值扫描为 *string

创建于 2013-02-28  ·  15评论  ·  资料来源: go-sql-driver/mysql

我曾经使用 Google Code 中的代码。 更新到 master 中的最新代码后,我收到了以前没有收到的以下错误:

sql: Scan error on column index 7: unsupported driver -> Scan pair: <nil> -> *string

我会进行更多调查,但也许在此期间您已经对此有所了解?

wontfix

最有用的评论

由于这个页面在搜索结果中仍然显示相当高,我的两分钱:

您也可以在imo,问题实际所在的部分解决它:数据库抽象级别。 您可以通过执行以下操作来解决此问题:

  SELECT
    id,
    COALESCE(name, '') as name
  FROM users

这样,如果name包含 NULL,则在扫描时将其替换为空字符串。 Coalesce 得到广泛支持。

所有15条评论

旧代码为NULL值返回了一个空的[]byte ,这使得无法区分NULL值和空字符串。
有关详细信息,请参阅问题 #20。

由于这个目标,错误由database/sql包返回:

* Be flexible with type conversions, but be paranoid about silent
  truncation or other loss of precision.

如果列可能包含 NULL 值,您必须使用http://golang.org/pkg/database/sql/#NullString

谢谢,有道理。

我几乎想要一种配置库的方法来给我旧的行为。 在某些方面,Go 的“默认零值”很有意义,并消除了大量样板代码。 我有点想把它放在一个地方,可配置的,而不是在我的代码中到处散布它,我可能会遇到 NULL。 使用 NullString 等在代码方面非常丑陋。

NULL 只是一场噩梦,我想摆脱 NULL。 我明确地将 _my_ 表中的每一列定义为 NOT NULL,但偶尔像 SHOW PROCESSLIST 这样的命令会在其中包含 NULL,而我的代码并不关心; 我想要一个空字符串。 我将使用 NullString,并忽略它的 .Valid 属性并只获取它的 .String,如果该列为 NULL,它将为空。

能够告诉驱动程序将 NULL 转换为类型的零值(或者实际上,我猜它真正做的是跳过将列扫描到变量中)将减少很多困难和容易出错(而不是 -面向未来)为我工作。 或者,如果我不想要所有样板代码,我可以保证列 a) 确实不可为空 b) 将永远保持这种状态。

我还希望 database/sql 包遵循 Go 的“默认零值”策略。 如果需要,您仍然可以区分 Null* 类型,但不幸的是,设计决定是这样做出的。 也许他们在 Go2 中更改了它(为此我提供了 +1)。
目前我没有计划为此添加驱动程序选项。 与 PostgreSQL 相比,该协议已经一团糟(我认为更有效)。 我不想让司机更加混乱。
现在,每个扫描的字符串多一个str = nullStr.Value是较小的邪恶。

我试图添加一个选项来将NULL值归零: https :
但在驱动程序级别上这是不可能的。 如果您将零值设置为[]byte{}您可以将其扫描到string[]byte但不能扫描到数字类型。 如果您将其设置为0 ,您可以将其扫描为数字类型,但您会得到“0”作为string / []byte

我不太明白驱动程序实际上是如何扫描的,但不是
将 dest[i] 设置为某个东西,如果驱动程序只是跳过设置怎么办
目的地[我]?

dest基本上是一个[]interface{}切片。 interface{}的默认值为nil 。 所以跳过设置dest[i]与设置dest[i]=nil结果相同

我更新了分支。 如果你愿意,你可以自己尝试一下。

这看起来很适合我的需求,下次更新时我会尝试一下
驱动程序的副本。

我想到了另一种解决方法:
只需使用 []byte 而不是字符串。 转换 nil-[]byte 会产生一个空字符串:

string([]byte(""))  // => ""
string([]byte(nil)) // => ""

http://play.golang.org/p/nivY1yBK3x

也许保持这个开放,也许对例子有好处

解决方法: https :

由于这个页面在搜索结果中仍然显示相当高,我的两分钱:

您也可以在imo,问题实际所在的部分解决它:数据库抽象级别。 您可以通过执行以下操作来解决此问题:

  SELECT
    id,
    COALESCE(name, '') as name
  FROM users

这样,如果name包含 NULL,则在扫描时将其替换为空字符串。 Coalesce 得到广泛支持。

我不明白当字符串为空时为什么会抛出异常

这个例子对我有用

您可以传递一个字符串指针来处理它,如下所示:

var txt *string
checkErr(result.Scan(&txt))
// do something with type *string

这对我来说可以。

除了@Dynom伟大的评论,我觉得还是可以值得一提的是, sql.NullString类型来得心应手,如果你想的目标,以解决这一问题Scan (这是我所看到的是转到侧面数据库抽象级别)。

此外,它还保留了区分nil值和空字符串的能力

对于空字符串,如果要显示像 json 这样的信息,则需要开发人员创建地图 vo。 这里没问题,是一种很好且正确的方法,但并非对所有情况都有意义,然后可能是语言限制的额外工作。

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