2016-09-22 126 views
3

我有一张表。这是创建声明。将NULL值插入到双数据类型MySQL Python

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 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行是第一个列表中它并没有给出来的一样截断误差第一个列表上?

+0

我很确定这是我正在执行的查询。它也奇怪,0值插入该列。 – essramos

+0

实际上任何一种方法(准备与否)都会给我在数据库上的相同结果,所以让我们使用最新的(未准备好的)。 – essramos

回答

3

这并不完全是令人惊讶的。首先插入python预定义常量None

types.NoneType的唯一值。没有经常用来代表 没有值,因为默认参数未传递给 函数。

这相当于SQL NULL。在第二种情况下,您将一个名为'None'的字符串插入表中。这两个是非常不同的。如果您将字符串插入到双精度字段或浮点字段中,您会看到各种错误,通常是您看到的精确错误。

一审

它的作品,因为你已经声明:

`float8value` double DEFAULT NULL, 

此接受空,并且未在您的值列表中的第8位。当使用许多不同的参数时,使用命名参数总是一个好主意,以便一目了然地明确每列的约束条件。

更新:

运行代码后,可达成的唯一结论是,你发现了一个bug,通过使用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') 

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

+0

我意识到这一点,问题是如何插入第一个列表而没有任何错误?为什么它没有在第二行上找到“无”的值? – essramos

+0

好吧,第一个vallist - >那些值被接受了。桌上已插入两行。 – essramos

+0

即时通讯很确定这是查询,我只有4行代码。其中包括列表和查询。 – essramos