Python向MySQL插入NULL值及空值处理详解
本文详解Python向MySQL插入NULL值的方法,区分%s占位符加不加引号的差异。深入对比数据库中NULL与空字符的区别,以及Python中None、Pandas中NaN与数据库NULL的对应关系,帮助开发者避免数据读取与写入时的类型错误。
在Python中向MySQL数据库插入NULL空值时,需要特别注意SQL语句的写法。
sql = “INSERT INTO MROdata (MmeUeS1apId) VALUES (%s)”%‘NULL'
当使用%s作为占位符且不加引号时,可以将字符串“NULL”直接写入数据库,从而正确实现NULL值的效果。
如果在%s外加了引号,例如“'%s'”,则插入的值会变为字符串“NULL”,这会导致类型不匹配错误,进而造成插入失败。
sql = “INSERT INTO MROdata (MmeUeS1apId) VALUES (‘%s')”%‘NULL'
补充说明:数据库中“空值”的概念与NULL存在区别,同时Python中的NaN和None也需要正确理解。
数据库中的“空值”主要包含两种形式:一种是空字符串(“”),另一种是标准的NULL值。
这两种存储方式在数据库应用中都非常常见,实际开发中可根据具体业务需求或个人编码习惯选择使用其中一种来存储“空值”。
那么这两种方式究竟有何区别?下面通过具体示例进行展示。
-- 创建表test
create table `test` (
`id` int not null ,
`name` varchar(255) null ,
`date` timestamp null ,
`class` varchar(255) null
);
insert into test (id,name,date,class) values (1,'张三','2017-03-01','a班');
insert into test (id,name,date,class) values (2,'李四','2017-03-02','');
insert into test (id,name,class) values (3,'王五','c班');
select * from test;

select count(date),count(class) from test;

理解这一点后应该明白,直观上看,空字符与NULL的主要区别在于COUNT统计时,空字符会被计入总数,而NULL则不会。因此,在使用WHERE IS NULL或IS NOT NULL进行查询时,务必注意数据库中存储的“空值”究竟是空字符还是真正的NULL,否则统计结果可能不符合预期。
否则统计结果可能并不是你想要的。
日常工作中,许多数据需要借助Python进行处理,我们需要关注Python获取数据时的注意事项。
Python获取数据主要有两种途径:
第一种方法是将数据从MySQL导出为TXT或CSV文件,然后在本地进行读取。
第二种方法是Python直接连接数据库,读取表中的数据。
首先看第一种情况:将数据导出为CSV,再由Python读取。

第二种情况:

通过这两种方式读取的数据竟然存在差异!
1、第一种方式中,数据从MySQL导出后,Python读取时,原本的空值显示为NULL。
2、第二种方式中,Python直接链接数据库后,能够读取表结构。此时,数据库中的NULL对应Python列表中的None,以及Pandas中的NaN(若字段类型为时间,则对应NaT)。而数据库中的空字符,在Python中仍被识别为空字符。
个人理解的数据对应关系如下:
NULL(数据库)= None(Python列表)= NaN(Pandas)
空字符(数据库)= 空字符(Python列表)= 空字符(Pandas)
从CSV文件中获取数据时:CSV中的空值 = NULL(数据库)= NaN(Pandas)
将数据转为CSV格式时:数据库中的NULL、空字符,以及Pandas中的NaN、空字符,在CSV中均表现为空值。
在Python处理完数据后,若需将数据写回数据库,同样需要注意上述对应关系。请务必注意!以上为个人经验总结,希望能给大家提供参考,也希望大家多多支持本站。如有错误或未考虑周全之处,望不吝赐教。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。如有错误或未考虑完全的地方,望不吝赐教。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









