gpt4 book ai didi

mysql - GORM UUID 太长

转载 作者:IT王子 更新时间:2023-10-29 01:44:46 26 4
gpt4 key购买 nike

目前,我对所有数据库查询(主要是 CRUD)都使用 GO-GORM,并且在将生成的 UUID 插入 MySQL 数据库列时遇到了一些问题。

该列是多个博客中建议的 BINARY(16),UUID 是使用 Golang 的 github.com/satori/go.uuid 包生成的。

我正在使用 GORM 的 BeforeCreate Hook 来生成 UUID(如果用户不存在),我使用的代码如下:

func (u *User) BeforeCreate(scope *gorm.Scope) (err error) {
if u.UserID == uuid.Nil {
uuid, err := uuid.NewV4().MarshalBinary()
scope.SetColumn("user_id", uuid)
}
}

我还使用 len 来获取 MarshalBinary 输出的长度,它返回 16。

我在尝试将 UUID 插入 MySQL 时从 GORM 得到的错误如下:

(错误 1406:第 1 行“user_id”列的数据太长)

我也有 fmt.Println(uuid) 来查看结果,它们也如下所示(随着每次插入生成 UUID,显然会发生变化)

[93 132 59 55 102 96 72 35 137 185 34 21 195 88 213 127]

我的MYSQL模式也如下:

CREATE TABLE users
(
id INT(10) unsigned PRIMARY KEY NOT NULL AUTO_INCREMENT,
created_at TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP,
user_id BINARY(16) NOT NULL,
username VARCHAR(255) NOT NULL,
password VARCHAR(255),
firstname VARCHAR(255),
lastname VARCHAR(255),
email VARCHAR(255),
address_id VARCHAR(255)
);
CREATE INDEX idx_users_deleted_at ON users (deleted_at);
CREATE UNIQUE INDEX username ON users (username);
CREATE UNIQUE INDEX user_id ON users (user_id);

我尝试了不同的方法和库来生成 UUID 并将它们转换为二进制以插入,结果相似。

最佳答案

我认为问题出在模型 User 的定义中。要将 GUID 保存为 16 字节二进制文件,您需要将 UserID 列定义为 []byte 而不是 uuid.UUID .

type User struct {
//other fields ..
UserID []byte

//other fields ...
}

func (u *User) BeforeCreate(scope *gorm.Scope) (err error) {
if u.UserID == nil {
uuid, err := uuid.NewV4().MarshalBinary()
scope.SetColumn("user_id", uuid)
}
return nil
}

如果您将字段定义为 uuid.UUIDgorm 会将字段“误解”为字符串,然后将该字符串作为二进制插入到数据库中。比如下面的UUID,

uuid: 16ac369b-e57f-471b-96f6-1068ead0bf98
//16-bytes equivalent
bytes: [22 172 54 155 229 127 71 27 150 246 16 104 234 208 191 152]

将作为 UUID 的 ASCII 码插入到数据库中

0x31 0x36 0x61 0x63 0x33 0x36 0x39 0x62 0x2D 0x65 ...
('1' '6' 'a' 'c' '3' '6' '9' 'b' '-' 'e' ...)

长度为 36 字节,因此您将收到 Error 1406: ...

关于mysql - GORM UUID 太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43848535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com