DataGrip与Sql Server编码问题解决

因为答主使用的是MacOS系统,在此系统上也没有SSMS,只有微软开发的Azure Data Studio,不过他不太符合我的使用习惯,最后还是投入JetBrains怀抱中,奔向了DataGrip,安装与使用说明见我们上期博客。Mac安装Sql server
不过学习了几天没有发现这个中文显示的问题,因为都是在用数字与英文字段,当我使用把字段换成中文名的时候就发生了问题,就是内容全部变为??,由此也可以知道这其中是出现了编码转换问题了,当然在网上也搜索了很多办法,并没有太好的解决(网上的主流方法是改变DataGrip字体+编码改变+设置字符串类型为nvarchar,尽管能解决显示中文的问题,但是无法解决查询中文显示不出来的问题!),不过最后我也查到了问题症结所在,且听我一步一步讲解。

认识字符编码

在我们环境当中,常见的编码格式是UTF-8,GB2312。而字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。
常见的就是我们所知道的ASCII码了,ASCII的最大缺点是只能显示26个基本拉丁字母、阿拉伯数目字和英式标点符号,因此只能用于显示现代美国英语(而且在处理英语当中的外来词如naïve、café、élite等等时,所有重音符号都不得不去掉,即使这样做会违反拼写规则)。而EASCII虽然解决了部份西欧语言的显示问题,但对更多其他语言依然无能为力。因此现在的苹果电脑已经抛弃ASCII而转用Unicode。
下图展示了GB2312编码表
在这里插入图片描述
而著名的Unicode 是基于通用字符集****,Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三种字符编码方案。
所以UTF-8 是一种国际化的编码方式,包含了世界上大部分的语种文字(简体中文字、繁体中文字、英文、日文、韩文等语言),也兼容 ASCII 码。GBK 是在国家标准 GB2312 基础上扩容后兼容 GB2312 的标准(好像还不是国家标准),专门用来解决中文编码的,是双字节的,不论中英文都是双字节的。

问题解决(sql server排序规则)

那么这里首先要检查DataGrip里面是否出现了编码问题,见下图,可见并没有出现问题。当然,这里有必要要插一句,一定要将字符类型定义为nvarchar()类型,否则即使了进行了下文也根本无法显示中文。 nchar,nvarchar, ntext的由来,这里的第一个字母n,就是代表unicode字符集 可以见此篇排查文章点击此处
在这里插入图片描述
那么会不会是sql server编码出现了问题?运行下列代码检查错误:

select COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage')

936 简体中文GBK
950 繁体中文BIG5
437 美国/加拿大英语
932 日文
949 韩文
866 俄文
65001 unicode UFT-8

在我的mac电脑上并没有出现任何问题,出现的是936,说明SQL server也没有出现问题。
当然到这里我是可以输出中文的信息了,但是却不能对中文进行查询
那么到底是哪里出现了问题??
经过大量的搜索与研究,终于明白了,在sql server中还有排序使用字符集名称
在管理器输入

select SERVERPROPERTY('Collation') --查看默认排序规则
select SERVERPROPERTY('SqlCharSetName')--查看排序使用字符集名称

在这里插入图片描述
那也就是这里排序是出现了问题,也就是说当我进行中文的查询的时候并不会展示出来,所以要进行更改数据库的排序规则。
在这里插入图片描述

具体代码如下:

ALTER DATABASE 数据库名 COLLATE Chinese_PRC_CI_AS

若出现操作报错的情况,则是因为出现数据库被其他用户连接使用时,出现排他锁的错误。此时用SQL语句修改数据库为单用户模式——改排序规则——再修改回多用户。
按照如下三个代码进行运行,并依次运行!

ALTER DATABASE 数据库名 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE 数据库名 COLLATE Chinese_PRC_90_CI_AS
ALTER DATABASE 数据库名 SET MULTI_USER

这样就完美解决了中文查询的问题了!
原因:
在创建sqlserver 数据库时未指定排序字符集,databases则会使用instances的排序规则。为了支持中文,需要设置成Chinese_PRC_CI_AS。
参考博客:
sql server排序规则

不过,可能会出现这样的查询错误:
Cannot resolve the collation conflict between “SQL_Latin1_General_CP1_CI_AS” and “Chinese_PRC_CI_AS” in the equal to operation.
解决方案:这是因为数据库的字符集不一致导致的,在条件后添加 COLLATE Chinese_PRC_CI_AS

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值