在系统里,空值用关键字null表示,空字符串则用一对没有间隔的英文双引号""或英文单引号''表示(access数据库单、双引号表示的空字符串都可被识别,而MSSQL则必须要用一对单引号表示空字符串)。前者的数据类型是未知的,而后者的数据类型则是明确的,即它属于字符型。在没有约束的情况下,null值可以被写入任何数据类型字段,而空字符串只能写入字符型字段里。在数据库里null(空值)表示没东西,一个字段在未写入数据前它天然就是空的,因此我们可以通过隐式或显式两种方式向数据表写入null值,但是空字符串只能通过显式方式写入数据表,因为空字符串实际上是一种特殊的字符(长度为0)它不会天然就存在的,存储空字符串是要占用物理磁盘空间的。
例如,有学生表
students(sid int primary key,name varchar(50) not null,sex char(1) not null,dob datetime not null,phone varchar(50):
-- 隐式向电话字段写入null(空值),也就是不向字段写入任何值
insert into students (sid,name,sex,dob) values(101,'张三','男','1996-01-04')
-- 显式向电话字段写入null(空值)
insert into students (sid,name,sex,dob,phone) values(101,'张三','男','1996-01-04',null)
-- 只能显式向电话字段写入空字符串'',否则null值会取而代之,这是null的天然属性使然
insert into students (sid,name,sex,dob,phone) values(101,'张三','男','1996-01-04','')
在EXCEL里,系统对于空的单元格统一当做空字符串进行处理,我们可以将null(空值)和空字符串混为一谈,而在数据库里则不得将两者视为一样,对它们需要分别处理,否则可能会出现混乱。请留意,在ACCESS数据表视图里,空字符串和null值的外观看起来都是“空”的,如果你看到“空”的字段值,不表示它一定就是空值,它也许是空字符串,如果已经显式存入了空字符串的话。而在MSSQL里系统会用不同的外观来展示null值和零长度字符串,前者显式为null,后者显式为“空”。
我们在使用不同的系统工具向MSSQL导入数据时,系统对于被导入数据中的“空字符串”的处理方式可能会有变化的,有些情况下会将“空字符串”当做NULL来处理,有些则会按实际值来处理,是空值的就导入为空值,是零长度字符串则导入为零长度字符串。一般来说从excel、TXT等导入系统会将空字符串当做null导入,而从数据库表导入则按实际值导入。
题主如果想将MSSQL数据表的NULL转换为空字符串,可以运行更新查询,例如
update students set phone='' where phone is null
也可以将字段的默认值设置为''零长度字符串,这样系统会在字段没有指定字段值时自动输入空字符串。
应该是你的数据库的表定义为不能为空,但你的数据有空的数据。如果你的excel确认都没有空的数据,打开excel,从最后一行的空白行开始,往后多选一些行,几十行或是几百行都行,选中后删除行。因为如果你在excel的最后空白行有过编辑,现在看到的是空白行,但导入的时候,会读取的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)