为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 GORM 在后格雷SQL 中将包含转义代码的 JSON 插入到 JSONB 列中

如何使用 GORM 在后格雷SQL 中将包含转义代码的 JSON 插入到 JSONB 列中

Go
HUH函数 2022-09-12 20:11:06
我正在尝试将 JSON 字节存储到后greSQL,但有一个问题。\u0000 无法转换为文本。正如您在下面看到的,JSON包含诸如 之类的转义序列,似乎PostgreSQL将其解释为unicode字符,而不是JSON字符串。\u0000err := raws.SaveRawData(data, url)// if there is "\u0000" in the bytesif err.Error() == "ERROR: unsupported Unicode escape sequence (SQLSTATE 22P05)" {    // try to remove \u0000, but not work    data = bytes.Trim(data, "\u0000")    e := raws.SaveRawData(data, url) // save data again    if e != nil {        return e // return the same error    }    return nil}保存的结构是:type RawJSONData struct {    ID        uint64         `gorm:"primarykey" json:"id"`    CreatedAt time.Time      `json:"-"`    DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`    Data      datatypes.JSON `json:"data"`    URL       string         `gorm:"index" json:"url"`}datatypes.JSON来自 gorm.io/datatypes。它似乎只是,它是(延伸自?)一个。json.RawMessage[]byte我使用后greSQL的类型来存储这些数据。JSONB桌子:create table raw_json_data(    id         bigserial not null constraint raw_json_data_pke primary key,    created_at timestamp with time zone,    deleted_at timestamp with time zone,    data       jsonb,    url        text);
查看完整描述

1 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

统一码转义序列在后记和列中根本不受支持:\u0000TEXTJSONB


jsonb 类型也会拒绝 \u0000(因为这不能在 PostgreSQL 的文本类型中表示)


您可以将列类型更改为:JSON


create table Foo (test JSON);

insert into Foo (test) values ('{"text": "明天再水\u0000绿塔的"}');

-- works

json 数据类型存储输入文本的精确副本


这样做的好处是可以使数据与您从 API 接收的数据相同,以防转义序列具有需要保留的某些含义。


它还允许您使用 Postgres JSON 运算符(例如 )进行查询,尽管将 JSON 字段转换为文本仍将失败:->>\u0000


select test->>'text' from Foo

-- ERROR:  unsupported Unicode escape sequence

类型的列也接受任何字节序列,而无需操作数据。在戈尔姆,使用 标签:BYTEAtype:bytea


type RawJSONData struct {

    // ... other fields

    Data      string `gorm:"type:bytea" json:"data"`

}

如果上述任何一项对您来说都不可接受,那么您必须清理输入字符串...


查看完整回答
反对 回复 2022-09-12
  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信