我主要对 MySQL 和 PostgreSQL 感兴趣,但您可以大致回答以下问题:
将空字符串存储为...的物理存储含义是什么?
谁能解释为什么
select case when '' = ' ' then 1 else 0 end, LEN(''), LEN(' '), DATALENGTH(''), DATALENGTH(' ');
Run Code Online (Sandbox Code Playgroud)
产量
----------- ----------- ----------- ----------- -----------
1 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
有趣的结果是,在
create table test ( val varchar(10) );
insert into test values( '' );
update test set val = ' ' where val = '';
Run Code Online (Sandbox Code Playgroud)
更新确实会用空白替换空字符串,但 where 子句保持为真,并且重复执行更新语句告诉
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud) 执行插入时,空字符串将转换为 null:
insert into test (f) values ('');
Run Code Online (Sandbox Code Playgroud)
现在,有一行 f 包含空值。
但是,当我查询表时,我不能使用 '':
select * from test where f='';
no rows selected
Run Code Online (Sandbox Code Playgroud)
我可以使用空值:
select * from test where f is null;
____F_
NULL
Run Code Online (Sandbox Code Playgroud)
所以......似乎Oracle决定不能将空字符串用于插入,但在执行查询时它们仍然是空字符串。关于空字符串何时变为空值以及何时仍为空字符串的文档在哪里?
在我的 MySQL 数据库中,我有一个名为的字段html_contents
,其中包含要在网页中显示的所有 html。显然 html 可能很大,而且肯定大于 64KB,因此我决定使用LONGTEXT
而不是VARCHAR
.
当字段未设置或留空时,您是否认为将其设置为 NULL 或空字符串更好(对于数据库来说别名更有效)?
我读过这篇文章:何时使用 NULL 以及何时使用空字符串?但它一般谈论空字符串(可能是小字符串而不是LONGTEXT
)。
我想知道 with 是否LONGTEXT
是一个不同的故事,它是否可以节省大量空间或执行时间,NULL
而不是留空LONGTEXT
。
我有一个接受各种 varchar 参数的存储过程。调用该过程的中间层代码在它提交的值方面不一致。例如,有时像“传输描述”这样的参数会被提交为 NULL,有时它会是一个空字符串。
就客户端而言,空字符串仅表示未输入值。
在插入数据之前,我应该将所有空的 varchar 参数转换为 NULL 吗?
我无法确定这是否属于保持数据完整性的最佳实践,还是一个坏主意,因为我没有代表实际提交给数据库的内容。
我应该注意到所有插入和更新都在审计日志中进行跟踪。