数据库中的空值与NULL的区别以及python中的NaN和None

本文详细解释了数据库中空字符和NULL的区别,特别是在进行count计算时的不同表现,并介绍了这些空值在Python中的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库里面的”空值”有两种:空字符(“”)、空值(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;

1

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

2

看到这里应该明白了,直观看空字符和NULL的区别在于,在做count计算的时候,空字符也会被计算在里面,而NULL不会。有些同学在使用where is null 和is not null 的时候也要注意数据库中的“空值”是空字符还是NULL。不然统计结果可能并不是你想要的。

平时有些数据是需要借助python 来处理的,我们来看看python获取数据的时候有哪些需要注意的。
python有两种方式获取数据:
1. 一种是把数据从MYSQL 中导出到txt或者csv,然后本地读取;
2. 另一种是python直接链接数据库,读取数据;
先看第一种:导出到csv,python 读取

3
第二种:
4

两种方式读取的数据居然不一样!

  1. 第一种把数据从MYSQL导出后,python读取时,空值即为NULL;
  2. 第二种链接数据库后,python能读取表结构,数据库的NULL对应列表中的None以及pandas中的NaN(如果字段类型是时间,则为NaT)。而数据库中的空字符,则被识别为空字符。

个人理解的等式

  • NULL(数据库)=None(python列表)=NaN(pandas)
  • 空字符(数据库)=空字符(python列表)=空字符(pandas)
  • 从csv中获取数据时:空值(csv)=NULL(数据库)=NaN(pandas)
  • 转为csv数据时:数据库中的NULL\空字符和pandas中的NaN\空字符,都变成csv中的空值

在python处理完数据后,往数据库写数据的时候也一样。注意注意!

如果对python中的None和NaN有疑问,可以看这位博主的 博文

### 向数据库插入空值 当使用Python数据库插入空值时,通常会涉及到`None``np.nan`两种表示方法。对于大多数数据库接口而言,在插入数据到数据库之前,应该将`None`转换成SQL中的`NULL`[^3]。 #### 使用 `mysql-connector-python` 在使用`mysql-connector-python`库的情况下,可以直接传递Python的`None`对象作为参数给SQL命令,该库能够自动将其映射为SQL中的`NULL`: ```python import mysql.connector from mysql.connector import Error try: connection = mysql.connector.connect(host='localhost', database='test_db', user='root', password='password') sql_insert_query = """ INSERT INTO employees (id, name, salary, start_date) VALUES (%s,%s,%s,%s)""" cursor = connection.cursor() result = cursor.execute(sql_insert_query, (1,'John Doe', None, '2023-09-08')) connection.commit() except Error as e: print("Error while connecting to MySQL", e) finally: if(connection.is_connected()): cursor.close() connection.close() ``` 这段代码展示了如何通过设置字段对应的为`None`来代表要插入的是一个`NULL`[^1]。 #### 使用 `pymssql` 同样的逻辑也适用于`pymssql`库,即可以通过传入`None`让其被解释为SQL Server里的`NULL`: ```python import pymssql conn = pymssql.connect(server='your_server', user='your_username', password='your_password', database='AdventureWorks') cursor = conn.cursor() insert_stmt = ( "INSERT INTO SalesLT.Customer " "(FirstName, LastName, CompanyName, EmailAddress, Phone)" "VALUES (%s, %s, NULL, %s, %s)" # Here we set one field explicitly to NULL. ) data = ('John','Doe','john.doe@example.com','(555)-555-5555') cursor.execute(insert_stmt, data) conn.commit() ``` 这里同样利用了`%s`占位符配合实际列表的方式来进行安全的数据绑定,并且直接指定了某列应设为空的情况[^2]。 需要注意的是,如果是在处理来自Pandas DataFrame或其他可能含有缺失得结构化数据源,则应当确保这些位置已经被适当地替换成了可以由所使用的DBAPI识别的形式——通常是`None`而不是`np.nan`,因为后者可能会引起错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值