首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Go中,如何扫描char和varchar数据类型有区别吗?

在Go中,如何扫描char和varchar数据类型有区别吗?
EN

Stack Overflow用户
提问于 2020-05-12 05:57:21
回答 1查看 462关注 0票数 2

我有一个struct Person,它有一个AccessMode类型的uint字段。在Postgres数据库中,AccessMode的数据类型是char(8)。我为AccessMode编写了一个自定义扫描函数,它实现了扫描仪接口。在扫描函数中,它被接收为ASCII字符串的uint8片表示形式。

当AccessMode的数据类型在数据库中更改为varchar(8)时,它将作为扫描函数中的string接收。以下是代码

代码语言:javascript
复制
type Access uint

type Person struct {
   AccessMode Access
}

func (a *Access) Scan(val interface{}) error {
  if bb, ok := val.([]byte); ok {                                                                                                             
    return a.UnmarshalText(bb)
  }
  return errors.New("scan failed: data is not a byte slice")
}

为什么在varchar和uint切片的情况下被接收为字符串,而在扫描函数中使用char数据类型呢?

EN

回答 1

Stack Overflow用户

发布于 2020-05-12 06:39:18

这取决于您使用的驱动程序,为了避免这样的问题,您需要查阅驱动程序的文档。例如,github.com/lib/pq驱动程序提供了关于其文档中的数据类型的部分。

  • 整数类型bigint、整型和bigint作为int64返回。
  • 浮点类型的实数和双精度作为float64返回。
  • 字符类型char、varchar和text作为字符串返回。
  • 时间类型日期、时间、时间z、时间戳和时间戳作为time.Time返回。
  • 布尔类型作为bool返回。
  • 字节类型返回为[]字节

您将在上面注意到,lib/pq声称将char类型的值返回为string,这是正确的,但是它可能看起来并非如此。我的意思是在postgres中有char类型,然后是"char"类型,而在上面的lib/pq指的是后者。

如果可能的话,您应该避免使用charvarchar,而应该使用text

焦炭是什么时候的炭?

当您将一个列声明为具有charchar(n)类型时,该列的实际类型将是bpchar (空白填充的、固定长度的字符类型),它不会由lib/pq处理(尽管可能应该是这样)。

当您将列声明为具有"char"类型时,该列的实际类型将是"char" (用于内部使用的单字节字符类型),这将由lib/pq处理,并作为string返回。

要在这种特殊情况下保护自己,可以使用类型开关。

代码语言:javascript
复制
func (a *Access) Scan(src interface{}) error {
    switch val := src.([]byte) {                                                                                                             
    case []byte:
        return a.UnmarshalText(val)
    case string:
        return a.UnmarshalText([]byte(val))
    }
    return errors.New("scan failed: data is not a byte slice")
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61744776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档