Microsoft SQLServer 数据库修改排序规则

最近因为测试环境 MSSQL 服务器排序规则区分大小写,导致实用到临时表(tempdb)的数据、临时对象都区分了大小写。所以重建了系统数据库并更改了排序规则,这里再次总结一下。

开始之前,先确认排序规则(或大小写是否敏感)


 
 
  1. --查看服务器排序规则(安装时指定的排序规则)
  2. SELECT SERVERPROPERTY( 'COLLATION') AS ServerCollation
  3. ,DATABASEPROPERTYEX( 'tempdb', 'COLLATION') AS TempdbCollation
  4. ,DATABASEPROPERTYEX(DB_NAME(), 'COLLATION') AS CurrentDBCollation
  5. --查看数据库排序规则
  6. SELECT name, collation_name FROM sys.databases
  7. --当前数据库是否大小写敏感
  8. SELECT CASE WHEN N 'A'=N 'a' THEN N '不敏感' ELSE N '敏感' END

此环境实例中,服务器排序规则为 Chinese_PRC_BIN ,当前数据库排序规则为 Chinese_PRC_CI_AS。若当前数据库创建的所有对象和执行脚本时,如果用到了变量、临时对象等,大小写不一致则出现问题。二进制(_BIN)排序规则是区分大小写的,参考 Windows
Collation Sorting Styles

安装实例时指定的排序规则,就是 master 数据库的排序规则,同时 model 和 msdb 的排序规则也保持一致,而 tempdb 和用户数据库的排序规则都是参照 model 数据库一样的。系统数据库是不能直接更改排序规则的,因此只能重建系统数据库,且让系统数据库的排序规则都一致。

重建实例排序规则和系统数据库排序规则:

1. 备份系统数据库!必要的,失败了或者以后要使用当前环境时,还可以回退!

2. 记住所有数据库及文件路径,保持到 excel 中。如果记得住所有数据库位置的话就不用了。

select DB_NAME(database_id) as name,physical_name from sys.master_files
 
 

3. 导出服务器配置(sp_configure)到 excel。因为重建系统数据库后配置会被初始化。

4. 导出账号信息到 txt。数据库重建,账户信息都会丢失,除了备份也要单独备份账号。(SQL Server 中登录账号与数据库用户迁移

5. 导出链接服务器生产脚本到 txt ,如果有的话。

6. 导出代理作业到 txt 。

7. (如果还有其他配置,如审核、邮件配置、策略等,都保存出来,后续再重建)

8. 分离所有用户数据库。


 
 
  1. select 'ALTER DATABASE ['+ name+ '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE'+ char( 10)+ 'go'+ char( 10)
  2. + 'EXEC master.dbo.sp_detach_db @dbname = N'''+ name+ ''''+ char( 10)+ 'go'+ char( 10)
  3. from sys.databases where name not in( 'master', 'model', 'msdb', 'tempdb')
9. 停止所有数据库相关服务。

10. 重建数据库并制定新的排序规则。打开命令行,进入安装目录。

cd D:\Software\en_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_520517
setup /QUIET /ACTION=REBUILDDATABASE /instancename=mssqlserver /SQLSYSADMINACCOUNTS=服务器账号 /sapwd=密码 /sqlcollation=Chinese_PRC_CI_AS

11. 启动 SQL Server 引擎服务,其他暂不启动。

12. 创建登录账户(之前导出的脚本)

13.  附加所有用户数据库。

14. 创建代理作业、链接服务器、更配置等!

完成!~

如果重建系统数据库后,还原 master 数据库,那么服务器排序规则和 master 数据库排序规则都还原和以前一样,所以不能还原,除非恢复到以前的环境。

如果还原 msdb 或 model ,该数据库排序规则也会还原,所以系统数据库备份都不要还原,重建系统数据库之后只能重新配置。

更改用户数据库排序规则:

ALTER DATABASE test COLLATE Chinese_PRC_CI_AS
 
 

更改数据库排序规则时,需要更改下列内容:

>>  将系统表中的任何 char、varchar、text、nchar、nvarchar 或 ntext 列更改为使用新的排序规则。
>> 将存储过程和用户定义函数的所有现有 char、varchar、text、nchar、nvarchar 或 ntext 参数和标量返回值更改为使用新的排序规则。
>> 将 char、varchar、text、nchar、nvarchar 或 ntext 系统数据类型和基于这些系统数据类型的所有用户定义的数据类型更改为使用新的默认排序规则。

对于数据库内字段定义的排序规则,参考下面的 设置或更改列排序规则

设置或更改列排序规则:


 
 
  1. --示例
  2. CREATE TABLE dbo.MyTable(
  3. PrimaryKey INT PRIMARY KEY,
  4. CharCol VARCHAR( 10) COLLATE French_CI_AS NOT NULL
  5. );
  6. GO
  7. ALTER TABLE dbo.MyTable ALTER COLUMN CharCol VARCHAR( 10) COLLATE Latin1_General_CI_AS NOT NULL;
  8. GO

如果下列其中之一当前正在引用一个列,则无法更改该列的排序规则:
>>  计算列
>>  索引
>>  自动生成或由 CREATE STATISTICS 语句生成的分发统计信息
>>  CHECK 约束
>>  FOREIGN KEY 约束

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【赛迪网-IT技术报道】SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:   1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)     2、I/O吞吐量小,形成了瓶颈效应。     3、没有创建计算列导致查询不优化。     4、内存不足     5、网络速度慢     6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)     7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)     8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。     9、返回了不必要的行和列     10、查询语句不好,没有优化 ●可以通过以下方法来优化查询 : 1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要。 2、纵向、横向分割,减少的尺寸(sp_spaceuse) 3、升级硬件 4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段。 5、提高网速。 6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。 配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server? 2000时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的1.5倍。如果另外安装了全文检索功能,并打算运行Microsoft搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的3倍。将SQL Server max server memory服务器配置选项配置为物理内存的1.5倍(虚拟内存大小设置的一半)。 7、增加服务器CPU个数;但是必须 明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询 的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作UPDATE,INSERT, DELETE还不能并行处理。 8、如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。 like ''a%'' 使用索引 like ''%a'' 不使用索引用 like ''%a%'' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。 9、DB Server 和APPLication Server 分离;OLTP和OLAP分离 10、分布式分区视图可用于实现数据库服务器联合体。 联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。有关更多信息,参见设计联合数据库服务器。(参照SQL帮助文件''分区视图'') a、在实现分区视图之前,必须先水平分区 b、 在创建成员后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样,引用分布式分区视图名的查询可以在任何一个成员服务器上 运行。系统操作如同每个成员服务器上都有一个原始的复本一样,但其实每个服务器上只有一个成员和一个分布式分区视图。数据的位置对应用程序是透明的。 11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收缩数据和日志 DBCC SHRINKDB,DBCC SHRINKFILE. 设置自动收缩日志.对于大的数据库不要设置数据库自动增长,它会降低服务器的性能。 在T-sql的写法上有很大的讲究,下面列出常见的要点:首先,DBMS处理查询计划的过程是这样的:   1、 查询语句的词法、语法检查     2、 将语句提交给DBMS的查询优化器     3、 优化器做代数优化和存取路径的优化     4、 由预编译模块生成查询规划     5、 然后在合适的时间提交给系统处理执行     6、 最后将执行结果返回给用户。 其次,看一下SQL SERVER的数据存放的结构:一个页面的大小为8K(8060)字节,8个页面为一个盘区,按照B树存放。
SQL Server 2014基础入门视频教程 (40集,含课件) 1.SQL Server 2014简介.mp4 2.SQL Server 2014硬件和软件要求.mp4 3.SQL Server 2014数据库安装.mp4 4.SQL Server 2014数据库创建.mp4 5.SQL Server 2014数据库修改与删除.mp4 6.SQL Server 2014数据库备份与还原.mp4 7.SQL Server 2014数据类型.mp4 8.SQL Server 2014新建.mp4 9.SQL Server 2014修改、删除结构.mp4 10.SQL Server 2014定义主键、外键.mp4 11.SQL Server 2014新增记录.mp4 12.SQL Server 2014查询记录.mp4 13.SQL Server 2014修改记录.mp4 14.SQL Server 2014删除记录.mp4 15.SQL Server 2014条件限制where.mp4 16.SQL Server 2014 BETWEEN语法.mp4 17.SQL Server 2014子查询IN.mp4 18.SQL Server 2014子查询EXISTS.mp4 19.SQL Server 2014返回记录排序.mp4 20.SQL Server 2014关联查询.mp4 21.SQL Server 2014聚合函数AVG() SUM().mp4 22.SQL Server 2014聚合函数MIN() MAX().mp4 23.SQL Server 2014COUNT和SUM()函数.mp4 24.SQL Server 2014 LEN()函数.mp4 25.SQL Server 2014随机数的产生.mp4 26.SQL Server 2014 GETDATE() GETUTCDATE().mp4 27.SQL Server 2014 CONVERT函数.mp4 28.SQL Server 2014 DATEDIFF函数.mp4 29.SQL Server 2014 DATEPART函数.mp4 30.SQL Server 2014 CHARINDEX函数.mp4 31.SQL Server 2014 STUFF函数.mp4 32.SQL Server 2014 SUBTRING函数.mp4 33..SQL Server 2014 LEFT()和RIGHT函数.mp4 34.SQL Server 2014 LTRIM()和RTRIM()函数.mp4 35.SQL Server 2014 UPPER()和LOWER()函数.mp4 36.SQL Server 2014 REPLACE()函数.mp4 37.SQL Server 2014 REPLICATE和SPACE()函数.mp4 38.SQL Server 2014 REVERSE函数.mp4 39.SQL Server 2014 CAST函数.mp4 40.SQL Server 2014 CASE函数.mp4

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值