这段时间的工作主要是业务的后端存储从tikv迁移到mysql,在切换过程中也遇到一些坑, 特此记录。
docker拉起mysql容器。然后通过如下命令进去容器
docker exec -it mysql bash
再执行mysql进入数据库后,无法输入中文,同时在这个窗口执行sql语句都无法正常显示中文。
经过一番搜索,发现是docker exec后的字符终端需要设置成UTF-8
可以通过如下命令进入mysql容器
docker exec -it mysql-tianchi env LANG=C.UTF-8 bash
或者等候后执行
export LANG=C.UTF-8
然后在bash和mysql终端中都可以正常输入中文啦
type User struct {
ID string `gorm:"id" json:"id"`
Name string `gorm:"name" json:"name"`
Location Location `gorm:location" json:"location""`
}
func (User) TableName() string {
return "users"
}
type Location struct {
Province string `json:"province"`
City string `json:"city"`
}
func (l *Location) Scan(src interface{}) error {
bs, ok := src.([]byte)
if !ok {
return fmt.Errorf("src is not []byte")
}
if !json.Valid(bs) {
return fmt.Errorf("invalid json")
}
return json.Unmarshal(bs, l)
}
func (l Location) Value() (driver.Value, error) {
return json.Marshal(l)
}
这个很容易踩坑的地方就是这个自定义类型的Scan和Value方法
注意了: Scan是指针方法,Value是值方法
⚠️ 千万不要自作聪明的把他们都改成值方法或者指针方法
在一个业务表中,有个字段为order字段,执行创建表的时候一直报错
mysql> CREATE TABLE users (
-> id varchar(255) NOT NULL,
-> name varchar(255) DEFAULT NULL,
-> order varchar(255) DEFAULT NULL
-> );
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order varchar(255) DEFAULT NULL
)' at line 4
百思不得其解,这个语句也太简单了,实在想不到哪里会出错
后来在通义千问里问里下,原来order是mysql的保留字,在这里直接使用,mysql认为是order关键字,不是order字段名。
解决办法也比较简答,用反引号扩起来。
所以后续在写sql语句时,将字段、表名用反引号括起来是一个比较好的习惯
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。