SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法

摘要:
我们都知道SqlServer中的nvarchar类型可以完美地存储unicode字符,例如中文,但我们会发现,有时查询语句在查询nvarchar列时找不到它。从[dbo]中选择*。[T_UserInfo]whereName='Wang Qing'但如果在字符串前面添加N,则可以在任何环境[T_UserInfo]中正确查询结果select*from[dbo],其中Name=N'Wang Qiang'出现这种情况的原因是,在安装SqlServer期间,某些环境选择的排序规则是Latin1_General_CI_as,并且为某些环境选择的排序规则是Chinese_PRC_CI_AS,导致SqlServer上新创建的数据库的一些排序规则是Latin1_General_CI_AS、一些是Chinese_PRC_CI_AS

我们都知道在SqlServer中的nvarchar类型可以完美的存储诸如中文这种unicode字符,但是我们会发现有时候查询语句去查询nvarchar列的时候查不出来。

为什么nvarchar类型有时候需要前面带N的字符串才能查出结果

比如假如现在有一张表T_UserInfo如下,其中列[Name]为nvarchar类型用于存储中文姓名:

CREATE TABLE [dbo].[T_UserInfo](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Age] [int] NULL,
 CONSTRAINT [PK_T_UserInfo] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

表中的数据如下图所示:
SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第1张

运行如下Sql查询,在有些环境是可以查出来结果的而有些环境却查不出来结果。。。

select * from [dbo].[T_UserInfo] where Name='王强'

SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第2张

但是如果像下面这样在字符串前面加上N,无论在什么环境上都可以正确地查询出结果

select * from [dbo].[T_UserInfo] where Name=N'王强'

SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第3张

出现这种情况的原因就是因为SqlServer在安装的时候有些环境选择的排序规则是Latin1_General_CI_AS,而有些环境选择的排序规则是Chinese_PRC_CI_AS,导致在SqlServer上新建的数据库时有些排序规则是Latin1_General_CI_AS,有些是Chinese_PRC_CI_AS。

而当数据库的排序规则是Latin1_General_CI_AS时,那么nvarchar类型的列必须用前面带N的字符串去查询才能查出结果,如下所示:

select * from [CustomerDB].[dbo].[T_UserInfo] where Name=N'王强'--如果数据库[CustomerDB]的排序规则是Latin1_General_CI_AS那么必须要用N'王强'才能查询到结果

而当数据库的排序规则是Chinese_PRC_CI_AS时,那么nvarchar类型的列用前面带N和不带N的字符串都能查出结果,如下所示:

select * from [CustomerDB].[dbo].[T_UserInfo] where Name='王强'--如果数据库[CustomerDB]的排序规则是Chinese_PRC_CI_AS,那么用N'王强'和'王强'都能查询到结果

更改数据库的排序规则

知道了这个问题那么我们来尝试下更改数据库的排序规则,如下图所示当前SqlServer中数据库CustomerDB的排序规则是Latin1_General_CI_AS的

SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第4张

现在我们使用下面的alter database语句将其排序规则改为Chinese_PRC_CI_AS(注意alter database语句需要在没人用数据库的时候才能成功执行,所以最好将数据库设置为single user模式后,再运行alter database语句

alter database [CustomerDB] collate Chinese_PRC_CI_AS

然后再查看其数据库属性,发现CustomerDB的排序规则已经变为了Chinese_PRC_CI_AS
SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第5张

这个时候无论[T_UserInfo]表的[Name]列是什么排序规则,用N'王强'和'王强'都能查询出来结果,例如下图中我们看到虽然列[Name]的排序规则是Latin1_General_CI_AS,但是由于现在数据库CustomerDB的排序规则是Chinese_PRC_CI_AS,所以用'王强'是可以查询出结果的

SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第6张

SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第7张

更改数据库实例的排序规则

我们知道新建数据库时,数据库的默认排序规则就是数据库实例的当前排序规则,那么如果将数据库实例的排序规则设置为我们想要的值后,新建的数据库自然也是预期的排序规则,下面介绍如何用命令行更改数据库实例的排序规则。

首先我们可以看到数据库实例MSSQLSERVER当前的排序规则是Latin1_General_CI_AS

SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第8张

现在使用操作系统管理员权限启动cmd,也就是命令行提示符,然后定位到SqlServer安装文件所在的目录,在本例中我的SqlServer安装文件就在E盘(主要就是要找到安装文件setup.exe所在的目录)。

SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第9张

SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第10张

然后使用NET STOP MSSQLSERVER停止SqlServer服务,其中MSSQLSERVER就是你要更改SqlServer实例的windows服务名称

SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第11张

然后在命令行中使用如下命令调用setup.exe(注意:当使用Setup命令后,所更改数据库实例中的所有用户数据库都会被脱机(系统数据库不会),你需要在使用Setup命令后重新附加所有的用户数据库到数据库实例)

Setup /QUIET /ACTION=REBUILDDATABASE /instancename=<数据库实例名> /SQLSYSADMINACCOUNTS=<数据库管理员账号> /sapwd=<数据库管理员密码> /sqlcollation=Chinese_PRC_CI_AS

虽然MSDN说上面的sapwd参数可以省略,但是测试发现如果省略了这个参数,待上面的setup命令执行完后,数据库实例的排序规则还是没有改变,所以这里建议一定要使用sapwd参数输入数据库管理员账号的密码

现在执行上面的Setup命令

SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第12张

等待几分钟的时间setup命令执行完毕,然后我们再使用NET START MSSQLSERVER命令启动SqlServer服务

SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第13张

现在再查看数据库实例MSSQLSERVER的排序规则,可以看到数据实例MSSQLSERVER的排序规则已经变为了Chinese_PRC_CI_AS

SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第14张

另外使用下面的Sql查询也可以查到当前连接到数据库实例的排序规则

select SERVERPROPERTY('collation')

SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法第15张

SqlServer的排序规则关系到表的列,数据库及数据库实例,知道怎么配置排序规则对使用SqlServer还是比较重要的,希望通过本文大家能有所收获,谢谢!

免责声明:文章转载自《SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于HslCommunication组件的双模式客户端的说明,此说明适用于所有的派生类客户端,包括三菱,西门子,欧姆龙,modbustcp,机器人,simplifyNet客户端等等C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Hive 安装配置

实验简介 本次课程学习了如何安装配置 Hive。 一、实验环境说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序: XfceTerminal: Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令;...

plsql导出导入 表结构、表数据、存储过程等

导出:首先点击   TOOLS,选择  EXPORT TABLES  选中你需要导出的表,   勾选  “Create tables” 是因为在导入的数据库中没有此表 如果勾选"Drop tables" 而没有勾选 “Create tables” ,而数据库中没有此表,会报表和视图不存在 Output file 为导出的路径   如果你想导的表  数据记录...

sqlserver2008r2 版本数据库迁移到2019版本导致查询效率慢的解决方法

1、在sqlserver2008 版本的数据库引擎创建数据库后,迁移到sqlserver2019版本,存储过程查询效率变慢了。 2、主要原因:使用sqlserver2019版本的数据库软件创建,默认是不往低版本的数据库软件兼容。 3、处理版本,右击数据库-》属性-》选项-》兼容级别,选择SQL Server 2008 (100) 即可。    ...

【SQL server初级】数据库性能优化二:数据库表优化

数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第二部分   数据库性能优化二:数据库表优化   优化①:设计规范化表,消除数据冗余   数据库范式是确保数据库结构合理,满足各种查询需要、避免数据库操作异常的数据库设计方式。满足范式要求的表,称为规范化表,范式产生于20世纪70年代初,一般表设计满足前三范式就可以,在这里简单...

python(八):python使用lmdb数据库

一、入门代码 LMDB的全称是Lightning Memory-Mapped Database(快如闪电的内存映射数据库),它的文件结构简单,包含一个数据文件和一个锁文件: LMDB文件可以同时由多个进程打开,具有极高的数据存取速度,访问简单,不需要运行单独的数据库管理进程,只要在访问数据的代码里引用LMDB库,访问时给文件路径即可。 让系统访问大量小文...

MySql数据库优化、备份和恢复

一、数据库优化 1、为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 优化原则:减少系统瓶颈,减少资源占用,增加系统的反应速度。 2、数据库结构优化 需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。 将...