将NULL值插入双精度数据类型MySQL Python

我有桌子这是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']

这被插入.
数据库结果
enter image description here
但是当列表值是这个值时(区别是字符串’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的行成为列表中的第一行而又没有在第一个列表中给出相同的截断错误时,怎么会这样呢?

最佳答案

这并不完全令人惊讶.在第一个实例中,您要插入python预定义常量None

The sole value of types.NoneType. None is frequently used to represent
the absence of a value, as when default arguments are not passed to a
function.

这等于SQL NULL.在第二个实例中,您将在表中插入一个名为“ None”的字符串.这两个是非常不同的.如果在双精度或浮点型字段中插入字符串,您将看到各种错误,大多数情况下是您所看到的确切错误.

在第一个实例中它有效,因为您已经声明了:

 `float8value` double DEFAULT NULL,

这接受NULL,并且None在值列表中排在第八位.当使用许多不同的参数时,使用命名参数始终是一个好主意,这样一眼便可以看出绑定到每列的内容.

更新:

运行代码后,唯一可以得出的结论是您发现了一个错误,通过使用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')

这不会产生错误,但是如果擦除第一组值,则确实会产生错误.我的建议是提交错误报告