还不知道SQL中NULL和空字符串到底有什么区别?

场景

在系统中添加用户时前后端和数据库都没有做数据有效性的校验,导致添加用户时,输入的工号为空字符串也能添加到用户表中。如下图所示:
图片1
查看user表结构:
图片2
sno属性NOT NULL,但是在插入时插入的是’'空字符串,导致能够插入成功

隐患

设计数据库时这样的操作会导致严重的安全问题,前后端在编写代码时也都需要对数据有效性进行校验,避免系统中出现奇怪的数据。
在本例中,系统的默认密码也是sno,导致如下问题发生:
即:用户名和密码都为空的用户能够成功登录系统
图片3

总结

NULL 和 ‘’ 并不相等

### 在 MySQL 中区分 NULL 字符串的方法 在 MySQL 中,`NULL` 字符串(`''`)是两个完全同的概念。`NULL` 表示字段没有值或未知值,而字符串表示字段存在一个值,但该值为[^1]。 #### 判断字段是否为 `NULL` 可以使用 `IS NULL` 或 `IS NOT NULL` 来判断字段是否为 `NULL` 值。例如: ```sql SELECT * FROM example_table WHERE value IS NULL; -- 查询值为 NULL 的记录 SELECT * FROM example_table WHERE value IS NOT NULL; -- 查询值NULL 的记录 ``` #### 判断字段是否为字符串 对于字符串(`''`),可以直接使用等号(`=`)来判断。例如: ```sql SELECT * FROM example_table WHERE value = ''; -- 查询值为字符串的记录 SELECT * FROM example_table WHERE value != ''; -- 查询值字符串的记录 ``` #### 同时判断 `NULL` 字符串 如果需要同时判断字段是否为 `NULL` 或字符串,可以结合 `OR` 逻辑运算符。例如: ```sql SELECT * FROM example_table WHERE value IS NULL OR value = ''; -- 查询值为 NULL字符串的记录 ``` 相反,如果需要排除 `NULL` 字符串的记录,可以使用 `AND` 逻辑运算符。例如: ```sql SELECT * FROM example_table WHERE value IS NOT NULL AND value != ''; -- 查询值既NULL字符串的记录 ``` #### 示例代码 以下是一个完整的示例,展示如何区分 `NULL` 字符串: ```sql -- 创建表 CREATE TABLE test_table ( id INT NOT NULL, value VARCHAR(50) NULL ); -- 插入数据 INSERT INTO test_table (id, value) VALUES (1, NULL), -- NULL 值 (2, ''), -- 字符串 (3, 'Hello'); -- 非字符串 -- 查询值为 NULL 的记录 SELECT * FROM test_table WHERE value IS NULL; -- 查询值为字符串的记录 SELECT * FROM test_table WHERE value = ''; -- 查询值为 NULL字符串的记录 SELECT * FROM test_table WHERE value IS NULL OR value = ''; -- 查询值既NULL字符串的记录 SELECT * FROM test_table WHERE value IS NOT NULL AND value != ''; ``` ### 注意事项 - **默认值设置**:如果字段允许 `NULL`,建议为其设置一个合理的默认值以减少潜在问题。例如,可以将默认值设置为字符串或其他占位符[^2]。 - **聚合函数处理**:大多数聚合函数(如 `SUM`、`AVG`)会自动忽略 `NULL` 值,但在处理字符串时需要显式地进行过滤[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值