我有一张桌子。这是create语句。
CREATE TABLE `runsettings` (
`runnumber` mediumint(9) NOT NULL,
`equipment` varchar(45) NOT NULL,
`wafer` varchar(45) NOT NULL,
`settingname` varchar(100) NOT NULL,
`float8value` double DEFAULT NULL,
`apcrunid` varchar(45) DEFAULT NULL,
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`intvalue` int(11) DEFAULT NULL,
`floatvalue` float DEFAULT NULL,
`Batch` varchar(45) DEFAULT NULL,
`IndexNum` smallint(6) DEFAULT '1',
`stringvalue` mediumtext,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1056989 DEFAULT CHARSET=latin1;
这是我的插入声明:
import mysql.connector
cnx = mysql.connector.connect(user='test',
password ='test',host='0.0.0.1',
database='test')
vallist = [(471285, u'CT19', 7, u'271042', u'Etch Time Min', None, None, None),
(471285, u'CT19', 7, u'00000', u'Etch Time Min', None, None, 'None')]
cursor = cnx.cursor()
# ss =
cursor.executemany("INSERT INTO runsettings (apcrunid,equipment,runnumber,wafer,settingname,intvalue,floatvalue,float8value) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)",vallist)
cnx.commit()
所以我尝试插入这些值。
vallist = [471285, u'CT19', 7, u'271042', u'Etch Time Min', None, None, None,
471285, u'CT19', 7, u'00000', u'Etch Time Min', None, None, 'None']
这是插入的。
DB的结果
但是当列表值是这个时(差异是首先评估字符串'None'
):
vallist = [471285, u'CT19', 7, u'271042', u'Etch Time Min', None, None, 'None',
471285, u'CT19', 7, u'271042', u'Etch Time Min', None, None, None]
它给出了截断的错误。
Data truncated for column 'float8value' at row 2
如果包含None
的行是列表中的第一行,它在第一个列表中没有给出相同的截断错误?
答案 0 :(得分:4)
这并不完全令人惊讶。在第一个实例中,您将插入python预定义常量None
types.NoneType的唯一值。没有经常用来表示 没有值,因为默认参数没有传递给a 功能
这相当于SQL NULL
。在第二个实例中,您将在表中插入名为“None”的字符串。这两者非常不同。如果将字符串插入double或float字段,您将看到各种错误,通常是您看到的错误。
在第一个实例中它起作用,因为你声明了:
`float8value` double DEFAULT NULL,
这接受NULL并且None位于值列表的第8位。当使用大量不同的参数时,使用命名参数总是一个好主意,这样一眼就可以看出每个列的绑定是什么。
更新
运行代码之后,唯一可以达成的结论就是你发现了一个错误,通过使用print(cursor.statement)
可以发现执行的查询。
INSERT INTO runsettings (apcrunid,equipment,runnumber,wafer,settingname,intvalue,floatvalue,float8value)
VALUES (471285,'CT19',7,'271042','Etch Time Min',NULL,NULL,NULL),
(471285,'CT19',7,'00000','Etch Time Min',NULL,NULL,'None')
这不会产生错误,但如果删除第一组值,则确实会产生错误。我的建议是提交错误报告