SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法
我们都知道在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实例和数据库排序规则的办法的更多相关文章
- sql server 中 like 中文不匹配问题解决就这么简单
原文:sql server 中 like 中文不匹配问题解决就这么简单 MS-SQL Server select * from Book where BookName like'%C语言%' 在SQ ...
- java面试题:如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。
package com.swift; public class TotalNumber_String { public static void main(String[] args) { /* * 如 ...
- Tomcat 中get请求中含有中文字符时乱码的处理
Tomcat 中get请求中含有中文字符时乱码的处理
- 无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "SQL_Latin1_General_CP1_CI_AS" 之间的排序规则冲突。
什么是排序规则(collation) 关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许 ...
- 中文字符匹配js正则表达式
普遍使用的正则是[\u4e00-\u9fa5],但这个范围并不完整.例如: /[\u4e00-\u9fa5]/.test( '⻏' ) // 测试部首⻏,返回false 根据Unicode 5 ...
- 使用Java判断字符串中的中文字符数量
Java判断一个字符串str中中文的个数,经过总结,有以下几种方法(全部经过验证),可根据其原理判断在何种情况下使用哪个方法: 1. char[] c = str.toCharArray(); for ...
- Python中使用中文正则表达式匹配指定的中文字符串
业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发 ...
- mysql命令框中向表中插入中文字符,在可视化工具MySQL Workbeach或phpMyAdmin中不显示或显示乱码的问题解决
一.问题导出 在刚刚开始学习MySQL数据库应用与开发这门课程的时候,老师建议我们使用可视化工具MySQL Workbeach进行数据库的相关管理,但是小编在mysql命令框使用insert命令向表 ...
- sql server 中 like 中文不匹配问题
原文:https://blog.csdn.net/miao0967020148/article/details/71108056 MS-SQL Server select * from Book wh ...
随机推荐
- JS-009-屏幕分辨率、浏览器显示区域、元素位置获取
此文简略讲述有关屏幕大小.元素位置及大小获取. 执行文中脚本时,请先打开 Chrome 浏览器,并切换至开发者工具的控制台,并打开网址:http://www.yixun.com/,文中元素事例为页面元 ...
- JS-JQ实现页面滚动时元素智能定位(顶部-其他部位)
先看效果: 阅读前提:充分理解div的三种定位方式:浮动,相对定位,绝对定位 方法一(顶部) 原理:直接使用css 进行控制:缺点:不兼容ie6-: 实现:positi ...
- 浅谈Java回调机制
像许多网上介绍回调机制的文章一样,我这里也以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,于是就他告诉你他的手机号 ...
- 使用weave实现跨主机docker容器互联
关于weave的原理不做细致的说明,如果想了解weave可以登陆官网:https://www.weave.works/ In this post,使用阿里云3台ECS服务器进行weave搭建,并测试搭 ...
- 微信分享JS接口失效说明及解决方案
关键字:微信分享 JS 失效 分享到朋友圈 微信分享JS接口目前已失效,以前可以自定义分享的标题.描述.图片.链接地址在微信6.0.2版本中失效. 官方回复如下: 旧版的获取分享状态及设置分享内容的 ...
- EncodingAESKey
关键字:EncodingAESKey 公众平台消息体签名及加解密方案概述 1.新增消息体签名验证,用于公众平台和公众账号验证消息体的正确性 2.针对推送给微信公众账号的普通消息和事件消息,以及推送给设 ...
- [BS] 小知识点总结-01
1. UIImageView *imgView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"MainTitle&quo ...
- MVC项目实践,在三层架构下实现SportsStore-05,实现导航
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- T4教程2 T4模版引擎之生成数据库实体类
T4模版引擎之生成数据库实体类 在通过T4模版引擎之基础入门 对T4有了初步印象后,我们开始实战篇.T4模板引擎可以当做一个代码生成器,代码生成器的职责当然是用来生成代码(这不是废话吗).而这其中 ...
- canvas的代码封装
(function(window,document){ var cs2d = function(selector,options){ return new cs2d.fn.init(selector, ...