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

was*_*898 3 python mysql prepared-statement

我有桌子 这是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;
Run Code Online (Sandbox Code Playgroud)

这是我的插入语句:

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()
Run Code Online (Sandbox Code Playgroud)

所以我尝试插入这些值。

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']
Run Code Online (Sandbox Code Playgroud)

这被插入。数据库结果 在此处输入图片说明 但是当列表值是这个值时(区别是'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]
Run Code Online (Sandbox Code Playgroud)

它给出了截断的错误。

Data truncated for column 'float8value' at row 2 
Run Code Online (Sandbox Code Playgroud)

当包含该行None的列表中的第一行没有在第一张列表中给出相同的截断错误时,怎么会这样呢?

e4c*_*4c5 5

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

types.NoneType的唯一值。当没有将默认参数传递给函数时,通常不使用None来表示缺少值。

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

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

 `float8value` double DEFAULT NULL,
Run Code Online (Sandbox Code Playgroud)

这接受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')
Run Code Online (Sandbox Code Playgroud)

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