[go] database/sql包执行生成的SQL语句,遇到Incorrect Integer错误

在使用Go的database/sql包操作MySQL时,将tinyint类型的locked列映射为bool,导致插入错误。问题源于bool在转换为SQL语句时与tinyint类型不匹配。关闭MySQL的严格模式解决了这个问题,文章提到了严格模式的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

database/sql包执行生成的SQL语句,遇到Incorrect Integer错误

我的MySQL结构是这样的:
这里写图片描述

locked列是tinyint类型,MySQL中tinyint是1字节的整型。
在Go结构体中我将locked字段定义为了bool类型,我的原意是打算将false视作0,将true视作1。

type Zgd_Users_Table struct {
    Id          int64  `require:"true" auto_increment:"true" primary_key:"true"`
    User_name   string `require:"true"`
    User_mobile string `require:"true"`
    Password    string `require:"true"`
    Email       string `require:"true" default:""`
    Nickname    string `require:"true" default:"little zhe 001"`
    Level       byte   `require:"true" default:"3"`
    Locked      bool  `require:"true" default:"false"`
    Create_time string `require:"true" default:"zhe_user_0001"`
    Comment     string `require:"true" defaulr:""`
}

但当我生成最后的Insert语句——

INSERT INTO zgd_users_table (user_name,user_mobile,password,email,nickname,level,locked,create_time,comment) VALUES ("zhe_user_3387","19211111111","pass_0001"," ","狗蛋","0","false","2016-04-26 08:30:01.7811492 +0800 CST"," ");

执行的时候却出现错误——

panic: Insert row error:Error 1366: Incorrect integer value: 'false' for column 'locked' at row 1 [recovered]
        panic: Insert row error:Error 1366: Incorrect integer value: 'false' for column 'locked' at row 1

于是我将结构的bool类型改为uint8,执行的时候create_time列又报错:

panic: Insert row error:Error 1292: Incorrect datetime value: '2016-04-26 08:32:36.7287341 +0800 CST' for column 'create_time' at row 1 [recovered]
        panic: Insert row error:Error 1292: Incorrect datetime value: '2016-04-26 08:32:36.7287341 +0800 CST' for column 'create_time' at row 1

问题很明显,肯定是因为和MySQL建表时候列定义的类型不符合,我将所有列都以字符串的形式插入,在另一台电脑上,能成功执行。换了一台电脑就失败,我就纳闷怎么回事,转眼一想,最有可能的原因是strict mode,这台电脑上的MySQL因为开启了严格模式,所以在插入的时候不会进行转换,我将严格模式关掉,插入成功。
关于严格模式,在这篇文章中有讲。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值