我们都知道在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]

表中的数据如下图所示:

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

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

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

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

出现这种情况的原因就是因为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的

现在我们使用下面的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

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

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

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

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

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

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

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

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

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

现在执行上面的Setup命令

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

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

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

select SERVERPROPERTY('collation')

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

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

  1. sql server 中 like 中文不匹配问题解决就这么简单

    原文:sql server 中 like 中文不匹配问题解决就这么简单 MS-SQL Server select * from Book where BookName like'%C语言%'  在SQ ...

  2. java面试题:如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。

    package com.swift; public class TotalNumber_String { public static void main(String[] args) { /* * 如 ...

  3. Tomcat 中get请求中含有中文字符时乱码的处理

    Tomcat 中get请求中含有中文字符时乱码的处理

  4. 无法解决 equal to 运算中 &quot;Chinese_PRC_CI_AS&quot; 和 &quot;SQL_Latin1_General_CP1_CI_AS&quot; 之间的排序规则冲突。

    什么是排序规则(collation) 关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许 ...

  5. 中文字符匹配js正则表达式

    普遍使用的正则是[\u4e00-\u9fa5],但这个范围并不完整.例如:  /[\u4e00-\u9fa5]/.test( '⻏' ) // 测试部首⻏,返回false    根据Unicode 5 ...

  6. 使用Java判断字符串中的中文字符数量

    Java判断一个字符串str中中文的个数,经过总结,有以下几种方法(全部经过验证),可根据其原理判断在何种情况下使用哪个方法: 1. char[] c = str.toCharArray(); for ...

  7. Python中使用中文正则表达式匹配指定的中文字符串

    业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发 ...

  8. mysql命令框中向表中插入中文字符,在可视化工具MySQL Workbeach或phpMyAdmin中不显示或显示乱码的问题解决

     一.问题导出 在刚刚开始学习MySQL数据库应用与开发这门课程的时候,老师建议我们使用可视化工具MySQL Workbeach进行数据库的相关管理,但是小编在mysql命令框使用insert命令向表 ...

  9. sql server 中 like 中文不匹配问题

    原文:https://blog.csdn.net/miao0967020148/article/details/71108056 MS-SQL Server select * from Book wh ...

随机推荐

  1. Microsoft Dynamics AX 2009 White Paper: Close Non-Financial Transfers

    http://www.microsoft.com/en-us/download/confirmation.aspx?id=12174

  2. 【C++】动态内存与智能指针

    C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内 ...

  3. SQL Server xtype

    sysobjects 表 在数据库内创建的每个对象(约束.默认值.日志.规则.存储过程等)在表中占一行.只有在 tempdb 内,每个临时对象才在该表中占一行. 列名 数据类型 描述 name sys ...

  4. js保留n位小数

    1.功能:将浮点数四舍五入,取小数点后2位 function toDecimal(num) { var f = parseFloat(num); if (isNaN(f)) { return; } f ...

  5. iOS获取的NSDate date时间与实际相差8个小时

    NSDate *startDate = [NSDate date];NSTimeZone *zone = [NSTimeZone systemTimeZone];NSInteger interval ...

  6. saltstack之(五)数据系统Grains和Pillar

    一.grains 1.什么是grainsgrains:存储minion端的信息,包括一些网络.硬件等信息,保存在minion端.一般为静态信息,非经常变化的数据. 2.grains的使用:获取mini ...

  7. MVC项目实践,在三层架构下实现SportsStore-04,实现分页

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  8. javascript [] 与 {} 的区别

    []是数组形式,{}是对象形式,都可以包含其他类型.如var a= ["A","B",{a:1,b:2}];a[1] 取得的是B,a[2].b取得的是2;var ...

  9. Spring Boot 2 Swagger2

    本文将介绍RESTful API的重磅好伙伴Swagger2,它可以轻松的整合到Spring Boot中,并与Spring MVC程序配合组织出强大RESTful API文档. 它既可以减少我们创建文 ...

  10. Vue.2.0.5-组件

    什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能.在 ...