我正在尝试将 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"`
}
如果上述任何一项对您来说都不可接受,那么您必须清理输入字符串...
- 1 回答
- 0 关注
- 149 浏览
添加回答
举报
0/150
提交
取消