昨天在数据库中建立数据表的时候要求显示的添加一些系统语法规则,对于这些设置不知道都是什么含义,这次记录下来供以后学习。
1、SET ANSI_NULLS ON语句
T-SQL支持在与空值进行比较时,允许比较运算符返回TRUE或FALSE.通过设置SET ANSI_NULLS OFF可将此项激活。举个例子:
- 当 SET ANSI_NULLS 为 ON 时,SQL-92 标准要求在对空值进行等于 (=) 或不等于 (<>) 比较时取值为 FALSE。即使 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中包含非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍会返回零行。
- 当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中包含空值的行。使用 WHERE column_name<> NULL 的 SELECT 语句返回列中包含非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有不为 XYZ_value 也不为 NULL 的行。
2、SET QUOTED_IDENTIFIER ON
在创建一个表时,表名称正好是SQLSERVER的标识符,不管SET QUOTED_IDENTIFIER ON还是SET QUOTED_IDENTIFIER OFF都会提示错误。如果想以distinct为表时,在 SET QUOTED_IDENTIFIER on 的情况下是可以把sqlserver的标识符加上双引号来创建以sqlserver标识符为表名的表,但是加单引号也是不可以的。如下图代码
但是在QUOTED_IDENTIFIER为off的情况下,不管distinct加引号或不加引号或加双引号都是不可以的。因为在QUOTED_IDENTIFIER为off情况下,sqlserver的标识符是不允许加引号的。
3、SET ANSI_PADDING ON
建议始终将 ANSI_PADDING 设置为 ON。这个选项只在数据表的字符串字段被更新或者新的数据行插入到表中的时候作用。它控制着SQL Server在遇到字符串尾随空格时是否截断空格,以及是否填充空格以达到预定义的字符字段长度。
- 当设置为ON时,不将值按列的长度进行填充。不剪裁字符值中插入到varchar列的尾随空格和二进制值中插入到varbinary列的尾随零。
- 当设置为OFF时,将值按列的长度进行填充。剪裁varchar列的尾随空格和varbinary列的尾随零。
4、[DBNAME].[DBO].[TABLE]
对数据表进行增删改查的时候,经常会见到数据库名称+DBO+数据表的情况,比如select* from [TestDB].[dbo].[usertable]。那么这是什么含义呢?
- [TestDB]好理解,就是指定查询哪一个数据库。
- [dbo]是每个数据库的默认用户,具有所有者权限,即DbOwner。通过用DBO作为所有者来定义对象,能够使数据库中的任何用户引用而不必提供所有者名称。比如:你以User1登录进去并建表Table,而未指定DBO,当用户User2登进去想访问Table时就得知道这个Table是你User1建立的,要写上User1.Table,如果他不知道是你建的,则访问会有问题。如果你建表时把所有者指给了Dbo,则别的用户进来时写上Dbo.Table就行了,不必知道User1。不光表是如此,视图等等数据库对象建立时也要如此。建表、存储过程、视图等数据库对象时,其对应的所有者是创建它的用户。则除了该用户其他登录用户要引用这些东东时,都要加上前缀,很是麻烦。而且,程序因此易出错,你查来查去问题确出在这,浪费你时间。
- 为什么使用方括号将表名称、库名称括起来的原因:这个不是必须要加,但表名或字段名如果引用了sqlserver中的关键字,数据库会不识别这到底是关键字还是表名(或字段名)时就必须要加。比如,一个表名叫user,user在sqlserver中属于关键字,那么查询的时候必须要这样:
select * from [user]
否则就会报错。同理,如果user属于字段名,也同样要加,如
select * from 表名 where [user]=1
5、N''是什么意思?
加上 N 代表存入数据库时以 Unicode 格式存储。N'string' 表示string是个Unicode字符串。例如,'Michél' 是字符串常量而 N'Michél' 则是 Unicode 常量。Unicode 数据中的每个字符都使用两个字节进行存储,而字符数据中的每个字符则都使用一个字节进行存储。