存储中文,字段是varchar,为什么不是nvarchar?

  • 存储中文,字段是varchar,为什么不是nvarchar?
  • varchar 在SQL Server中是采用单字节来存储数据,nvarchar是使用Unicode来存储数据。中文字符存储到SQL Server中会保存为两个字节(一般采用Unicode编码),英文字符保存到数据库中,如果字段的类型为varchar,则只会占用一个字节,而如果字段的类型为nvarchar,则会占用两个字节。
    正常情况下,我们使用varchar也可以存储中文字符,但是如果遇到操作系统是英文操作系统并且对中文字体的支持不全面时,在SQL Server存储中文字符为varchar就会出现乱码(显示为??)。而且正常情况下,主机都会支持中文的环境,所以如果使用varchar来存储数据,在开发阶段是发现不了的,多数情况下,在布署阶段出现问题。
    当然,使用nvarchar存储英文字符会增大一倍的存储空间,但是在存储代价已经很低廉的情况下,优先考虑兼容性会给你带来更多的好处.
    所以在设计的时候应该尽量使用nvarchar来存储数据,只有在你确保该字段不会保存中文的时候,才采用varchar来存储。

SQL Server 视图

SQL CREATE VIEW 语句

什么是视图?

在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。

视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。

注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。

SQL CREATE VIEW 语法

注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。

SQL CREATE VIEW 实例

可以从某个查询内部、某个存储过程内部,或者从另一个视图内部来使用视图。通过向视图添加函数、join 等等,我们可以向用户精确地提交我们希望提交的数据。

样本数据库 Northwind 拥有一些被默认安装的视图。视图 “Current Product List” 会从 Products 表列出所有正在使用的产品。这个视图使用下列 SQL 创建:

我们可以查询上面这个视图:

Northwind 样本数据库的另一个视图会选取 Products 表中所有单位价格高于平均单位价格的产品:

我们可以像这样查询上面这个视图:

另一个来自 Northwind 数据库的视图实例会计算在 1997 年每个种类的销售总数。请注意,这个视图会从另一个名为 “Product Sales for 1997” 的视图那里选取数据:

我们可以像这样查询上面这个视图:

我们也可以向查询添加条件。现在,我们仅仅需要查看 “Beverages” 类的全部销量:

SQL 更新视图

您可以使用下面的语法来更新视图:

现在,我们希望向 “Current Product List” 视图添加 “Category” 列。我们将通过下列 SQL 更新视图:

SQL 撤销视图

您可以通过 DROP VIEW 命令来删除视图。

 

SQL Server最基本的 增删改查

use Test
–插入
insert into MyQQTest(QqName,QqPassword) values(5,5)
–清空
delete from MyQQTest
–删除(条件)
delete from MyQQTest where QqExplain = ‘这家伙很懒,什么都没留下’
–修改某列的所有数据
update MyQQTest set QqExplain = 123
–修改多列的数据
update MyQQTest set QqExplain = 123,QqName = 321
–修改某列的所有数据(带条件)
update MyQQTest set QqExplain = ‘这家伙很懒,什么都没留下’ where QqExplain = ‘123’
–查看所有
select * from MyQQTest
–按条件查找
select * from MyQQTest where QqRegTime = ’17:25:03′
–查看某列(多列)
select QqRegDate,QqRegTime from dbo.MyQQTest
–查看某列(多列),带条件
select QqRegDate,QqRegTime from dbo.MyQQTest where QqRegTime = ’17:28:55′
SQL_Code.zip(1.4 KB, 37 次)

SQL Server数据类型

    在创建数据表时,除了需要输入列的名称之外,还需要确定该列的数据类型,因此在SQL Server中提供了许多的数据类型。在这里介绍常用的数据类型:
    ⒈数字类型,常用:int、decimal
        ①整形:int、smallint、bigint
        ②浮点型:float、real、decimal
    ⒉文本类型,常用:char、varchar、nvarchar、text
        char、varchar、nvarchar、nchar、ntext、text等
    ⒊bit数据类型
        bit数据类型表示是否值,值只能是:0、1或空。
        这种数据类型适合存储只有两种可能的值,比如:yes或no、true或false、on或off
    ⒋日期时间类型
        日期数据类型常用:datetime来表示,这种数据类型可以存储从1957年1月1日至9999年12月31日之间所有的日期和时间数据。
    ⒌货币型数据
        在数据表中要输入钱或货币的值时通常使用money数据类型,这种数据类型可以存储从-9220~9220亿,可以精确到货币单位的1/10000

SQL Server/SQL 语句创建约束

为了保证数据的完整性,可以通过约束来实现。
自动保持数据完整性的一种方法。
可以对单个表或同表中多列的组合来实现条件限制。
约束可以分为:主键约束、外键约束、唯一约束、检查约束、缺省约束等
–1、主键约束
/*
一列或者多列的组合在表中具有唯一性,每个表中只有一列可以
注意:image和 text 类型列不可以作为主键约束
*/
use [MyLuoLuo.Com]
go
create table Table1
(
ID int not null,
Name varchar(20) not null,
Memo varchar(200) null,
constraint pk_ID primary key(ID,Name)
/*
语法:
constraint 约束列明 primary key(clustened,noclustened)
如:constraint pk_ID primary key(ID,Name)
*/
)on [primary]
–2、外键约束
/*
定义了表与表之间的关系。主关键字列值更新时,与它关联的表的数据也会跟着自动更新
如果插入数据过程中,主关键字数据不存在时,数据库系统会拒绝提交数据
注意:image与text不能使用
*/
use [MyLuoLuo.Com]
go
create table Student
(
StuID int identity(1000,1) not null,
StuName varchar(20)not null,
Age int null,
Memo varchar(200) null,
ClassID int not null,
foreign key(ClassID)references Classes(ClassID)
/*
语法:
Foreign key(列名) references 外键表名(外键列)
*/
)on [primary]
–3、唯一约束
/*
保证数据值具有唯一性,防止插入重复的数据。
唯一约束可以有null值
*/
use [MyLuoLuo.Com]
go
create Table Users
(
UserID int identity(1,1) not null,
Name varchar(20) not null,
Account varchar(20) not null,
Pwd varchar(12) not null,
constraint uk_Account unique(Account)
/*
constraint 约束名 unique(列名)
*/
)on [primary]
–检查约束
/*
列或者表设置检查条件
*/
use [MyLuoLuo.Com]
go
create table Scores
(
ID int identity(1,1) not null,
StuID int not null,
Score int not null,
constraint chk_Score check(score>0)
)on [primary]
–按约束范围可以分为表约束和列约束。主键约束就属于表约束,而检查约束就属于列约束。

SQL Server/SQL语句建表

[cc lang=”sql”]
–============创建表==============
use [MyLuoLuo.Com]
go
create table [dbo].Classes(
ClassID int identity(1,1) not null,
ClassName varchar(50) not null,
Memo varchar(500) null,
Count int default 30,
Fee int not null,
Total as [Count] * Fee,
)
–null 允许为空
–not null 不允许为空
–identity(初始值,增长速度) 自增长,适用于数值类型
/*
Create Table 表名(表名在同一数据库中必须唯一,最大长度128字符)
(
–每个表必须包含一列,最多1024列
–列名 类型(长度) 是否为空
ClassID int identity(1,1) not null,–从1开始自增,每次增加1
ClassName varchar(50) not null,
Memo varchar(500) null,
Count int default 30, –默认值为30
Fee int not null,
Total as [Count] * Fee,–表达式,计算Count×Fee的结果
)
*/
–============创建表==============
–============创建临时表==============
create table #TempTable(
id int identity(1,1) not null,
test varchar(20) not null,
)on [Primary]
–临时表命名规则与表命名规则相同,但系统会为临时表追加12个长度的后缀,所以临时表实际为116个字符.
–局部临时表#
–全局临时表##
–临时表会被存放在系统数据库tempdb下
–============创建临时表==============
 [/cc lang=”sql”]

一个SQL数据库包含几个文件?

分为“主要文件,次要文件,事物日志文件”,其中“主要文件和事物日志文件”是必须存在的。
mdf为后缀的文件为主数据库文件
ldf为后缀的文件为日志文件,记录数据库的所有操作。登录信息不会被记录。

数据库文件

SQL Server 数据库具有三种类型的文件,如下表所示: 

文件 说明
主要 主要数据文件包含数据库的启动信息,并指向数据库中的其他文件。 用户数据和对象可存储在此文件中,也可以存储在次要数据文件中。 每个数据库有一个主要数据文件。 主要数据文件的建议文件扩展名是 .mdf
次要 次要数据文件是可选的,由用户定义并存储用户数据。 通过将每个文件放在不同的磁盘驱动器上,次要文件可用于将数据分散到多个磁盘上。 另外,如果数据库超过了单个 Windows 文件的最大大小,可以使用次要数据文件,这样数据库就能继续增长。次要数据文件的建议文件扩展名是 ndf
事务日志 事务日志文件保存用于恢复数据库的日志信息。 每个数据库必须至少有一个日志文件。 事务日志的建议文件扩展名是 .ldf

例如,可以创建一个简单的数据库 Sales,其中包括一个包含所有数据和对象的主要文件和一个包含事务日志信息的日志文件。也可以创建一个更复杂的数据库 Orders,其中包括一个主要文件和五个次要文件。 数据库中的数据和对象分散在所有六个文件中,而四个日志文件包含事务日志信息。

默认情况下,数据和事务日志被放在同一个驱动器上的同一个路径下。 这是为处理单磁盘系统而采用的方法。 但是,在生产环境中,这可能不是最佳的方法。 建议将数据和日志文件放在不同的磁盘上。

文件组

每个数据库有一个主要文件组。 此文件组包含主要数据文件和未放入其他文件组的所有次要文件。 可以创建用户定义的文件组,用于将数据文件集合起来,以便于管理、数据分配和放置。

例如,可以分别在三个磁盘驱动器上创建三个 文件 Data1.ndf、Data2.ndf 和 Data3.ndf, 然后将它们分配给文件组 fgroup1。然后,可以明确地在文件组 fgroup1 上创建一个表。 对表中数据的查询将分散到三个磁盘上,从而提高了性能。 通过使用在 RAID(独立磁盘冗余阵列)条带集上创建的单个文件也能获得同样的性能提高。 但是,文件和文件组使您能够轻松地在新磁盘上添加新文件。

下表列出了存储在文件组中的所有数据文件。

文件组 说明
主要 包含主要文件的文件组。 所有系统表都被分配到主要文件组中。
用户定义 用户首次创建数据库或以后修改数据库时明确创建的任何文件组。

默认文件组

如果在数据库中创建对象时没有指定对象所属的文件组,对象将被分配给默认文件组。 不管何时,只能将一个文件组指定为默认文件组。 默认文件组中的文件必须足够大,能够容纳未分配给其他文件组的所有新对象。
PRIMARY 文件组是默认文件组,除非使用 ALTER DATABASE 语句进行了更改。 但系统对象和表仍然分配给 PRIMARY 文件组,而不是新的默认文件组。

数据库安全概述

安全问题不是数据库系统所独有的,所有的计算机都普遍遇到这样的问题。

数据库的安全是指保护数据,不把数据泄露给不相关的人员,避免数据库被不法人员所攻陷。

计算机系统的安全性问题

随着计算机网络技术的日益发展和壮大,计算机安全性问题越来越得到了人们的重视。所谓计算机的安全性,我们一般考虑保护计算机的硬件、软件以及数据,防止因为偶然或者恶意的原因使系统遭到破坏,数据找到篡改或者泄露等。
计算机安全不仅涉及计算机系统本身的技术问题、管理问题,而且还涉及到犯罪学、心理学等。
通常人们将计算机安全系统的问题分为三大类:
1、技术安全
    在计算机系统中采用具有一定安全性的硬件、软件来实现对计算机系统以及所存储数据的保护如:
        ⑴、硬件防火墙
        ⑵、杀毒软件
    使用这些技术来防止计算机系统所受到无意的或者恶意的攻击。保证我们的系统在运行的时候数据不丢失、不泄露也不增加。黑客攻击是非常危险的,比如黑客盗取QQ密码、银行账户、在网页上挂马等。我们采用一定的硬件和软件,保证我们的系统受到攻击的时候仍然能够正常的运行。
2、管理安全
    在技术安全之外,比如说:软硬件的意外故障、场地的意外事故、管理不善导致的计算机设备或者数据介质的损害、丢失这些安全问题,通常视为管理安全。
    比如911事件之后,大量设在美国世界贸易中心的投资公司,他们的电脑都损坏了,因此丢失了大量的数据。数据丢失非常遗憾但实际上还是管理不善导致的。
3、政策法律安全
    政策法律它主要是指政府部门建立的有关计算机犯罪、数据安全保密等等先关的法律道德准则。

计算机系统安全性的评测等级

由于人们对计算机系统的安全性的要求越来越高,为此在计算机安全技术方面逐步发展了一套可信计算机评测标准。
(图一)
 
如图一,可信计算机评测标准它将计算机系统的安全等级分为4类7级.
分别是ABCD四类,每个类分为几个等级。 从低级到高级依次为D、C、B和A四类,A是最高的一类,每一类都代表一个保护敏感信息的评判准则,并且一类比一类严格。
D类:D类是最小的保护类。这是安全级别最低的一类,不再分级,这类是那些通过评测但达不到较高级别安全要求的系统。早期的商用系统属于这一类。
C类:C类是无条件的保护类。C类提供的无条件的保护也就是“需要则知道”(Need-to-Known)的保护,C类分为C1和C2两个子类。
    ①C1是无条件的安全保护类。这是C类中安全级别较低的一个子类,提供的安全策略是无条件的访问控制,具有识别与授权的责任。早期的UNIX系统属于这一类。
    ② C2是有控制的存取保护类。这是C类中安全级别较高的一个子类,除了提供C1中的策略与责任外,还有访问保护和审计跟踪功能。如SCOUNIX。
B类:B类是属强制保护类,要求系统在其生成的数据结构中带有标记,并要求提供对数据流的监视,B类分为B1、B2和B3三个子类。
    ①B1是标记安全保护类,是B类中的安全级别最低的子类,除满足C类要求外,要求提供数据标记。
    ② B2是结构安全保护类,是B类中的安全级别居中的子类,除满足B1要求外,要实行强制性的控制。
    ③B3是安全域保护类,是B类中的安全级别最高的子类,提供可信设备的管理和恢复,即使计算机崩溃,也不会泄露系统信息。
A类:A类是经过认证的保护类,是安全系统安全级别最高的类,这类系统可建立在具有结构、规范和信息流密闭的形式模型基础之上。A1类也是经过认证保护类。在TCSEC准则中,共定义了四类7级可信计算机系统准则。例如,银行界一般都使用满足C2级或更高级别的计算机系统。 

数据库安全控制

在互联网迅速发展的今天,数据安全是每个企业最关心的问题,数据库的安全也就成为了大家关注的焦点。数据库一般采用用户标识和鉴别存取控制视图机制密码存储等这些技术用来进行安全控制。
用户标识和鉴别的方法很多,常用的方法是:
1、用户标识和鉴别
    ⑴身份认证
        用户身份是系统管理员为用户定义的用户名,也称为用户的标示、账号、用户ID、登录名等。它通常记录在计算机系统中,或者数据库中。比如我们使用的SQL Server 2008数据库,它有两种认证方式,一种是Windows身份认证,它的登录名保存在计算机系统中;一种是SQL Server身份验证,它的登录名保存在数据库中。身份认证时将用户输入的用户名与系统合法的用户名进行匹配。从而鉴别这个用户是否是合法的用户,如果是则进入下一步的审核如:密码审核;如果不是则用户不能使用该系统。
    ⑵口令认证
        用户口令是指合法用户自己定义的密码,为了安全性口令是由用户自己定义并且随时可以修改,口令认证是为了进一步对用户进行核实,通常系统要求输入口令,只有口令正确才能进入系统。例如:我们登陆SQL Server 2008输入登录名和密码,只有登录名正确才能进行密码的核实。如果密码正确才可以进入数据库管理系统,反之如果不正确则不能进入。
存取控制
2、存取控制
存取控制是数据库安全的重要保证,它确保只让有资格的用户去访问数据库。并在其权限内操作数据库中的相关数据,这样没有授权的用户就没办法访问数据库中的数据。存取控制主要由:定义用户权限检查权限两个部分组成
    ⑴、定义用户权限
对数据库对象,我们可以进行各种的操作,比如:查询、添加、修改、删除等。或者在指定的数据库中创建数据表,那么在一个系统中不同角色的人员,或者说不同身份的人员他们可以操作的内容不同。
    ⑵、检查权限
        当用户发出存取数据库的操作之后,数据库管理系统首先检查用户,看它是否有权限。如果有就允许;如果没有则阻止。

视图机制

在关系型数据库中,可以给不同的用户定义不同的视图,通过视图机制可以把要保密的数据对没有权限的人员隐藏,从而提供一定程度的安全保护,并且也可以对试图进行授权
数据机制的优点:
    ⑴数据安全性
    ⑵数据逻辑独立性
    ⑶操作简便

审核方法

审核功能就是将用户对数据库的所有操作都记录下来,一旦发现数据被非法的存取,那么数据库管理员就可以利用这些日志,去重现发生非法存取的时候是哪个用户登录,事件发生的时间以及所窃取的内容等。
⑴记录所有数据库的操作
⑵重现数据非法存取导致的现状的一系列事件
⑶运行审核所消耗的时间和空间
⑷数据库管理员根据对安全性的要求,灵活打开或关闭审计功能

数据加密

对于一些高度敏感的数据,比如:银行系统中的用户密码、财务数据、军事数据等,除了上面介绍的数据保护之外,还需要数据加密的技术,数据加密是防止数据在存储或者传输的过程中被窃取的有效手段。
加密的基本思想是将原始的数据,通过一定的算法将原始数据(明文)变换为一种不可识别的格式,也就是密文。
从而使不知道数据算法的人无法获取数据的真正内容,从而保证数据的安全性。
加密的方法通常有两种:
    ⑴替换方法
        使用密钥将明文中的每一个字符替换为密文中的字符。
    ⑵置换方法
        将明文明文中的字符按照不同的顺序重新排列。
 

PL/SQL

PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。是Oracle数据库对SQL语句的扩展。

它在普通SQL语句的基础上增加了编程语言的特点,所以使用PL/SQL可以编写具有很多高级功能的程序。
PL/SQL块由四个基本部分组成:
1、声明(DECLARE—可选部分)
    变量、常量、图标、用户定义异常的声明。
2、执行体开始(BEGIN—必要部分)
    这部分是由SQL语句和PL/SQL语句所构成的执行程序,通常这部分由BEGIN语句引导。
3、异常处理(EXCEPTION—可选部分)
    当程序出现异常的时候捕获异常并且处理异常。
4、执行体结束(END —必要部分)
    END语句。

T-SQL

T-SQL是SQL语言的加强版,它提供了:

1、数据定义语言(DDL)
    CREATE、DROP、ALTER等语句(创建数据库、数据表;删除数据库、表;修改数据表、关系等)
2、数据操作语言(DML)
    INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。
3、数据查询语言(DQL)
    SELECT语句。
4、数据控制语言(DCL)
    GRANT、COMMIT、ROLLBACK等语句。