RDS SQL SERVER 解决中文乱码问题

问题引入

这天老鸟又开始纠缠着菜鸟:“菜鸟啊,我们最近遇到一个RDS SQL Server 2008 R2的奇怪的问题,我们的生僻字写入到RDS SQL Server中,查询结果展示出来是乱码呀?你去解决下这个问题吧。”。
“可是,鸟哥,我最近在做关于SQLTest的系列文章啊,暂时抽不出。。。。。。”。
“那个暂时先放放,这个比较紧急,尽快,立刻,马上去复盘并解决掉,Understand?”。还没等菜鸟说完,老鸟已经迫不及待的发号施令了。

复盘分析

看到老鸟为这事着急上火的样子,菜鸟已经意识到问题的严重性,于是放下手中的活,赶紧投入到这个问题的复盘分析中来。

复盘

经过一番翻云覆雨的研究后,菜鸟拿出了复盘的例子来,参见下面的代码:

use tempdb
go
IF OBJECT_ID('#temp', 'U') IS NOT NULL
    DROP TABLE #temp
GO

create table #temp(
firstName varchar(10)
)

insert into #temp
select '䅇'
union all
select '库'
;

select * from #temp

查询结果如下图所示:

分析

从查询结果展示来看,生僻字“䅇 (su)” 的确显示为乱码问号(?)。菜鸟终于复盘了老鸟说得场景,但是他还是高兴不起来。难道RDS SQL Server 2008R2真如鸟哥所说,对生僻字不支持吗?高端大气上档次的阿里云RDS SQL Server不至于吧?随着研究的深入,菜鸟渐渐的找到问题的根本原因:
SQL Server是使用Unicode编码的数据类型来支持中文的,比如:NCHAR, NVARCHAR等数据类型,类似的语言还有拉丁语系,和包含中文在内的亚洲语言。所以,要解决这问题,我们的数据类型选择就必须是Unicode编码的数据类型,很显然复盘例子中的数据类型VARCHAR选择错误,我们只需要将这个数据类型修改为NVARCHAR,即可解决问题了。

解决问题

在正确分析了问题所在以后,解决问题就变得很简单了,参见下面的测试代码:

use tempdb
go
IF OBJECT_ID('#temp', 'U') IS NOT NULL
    DROP TABLE #temp
GO

create table #temp(
firstName nvarchar(10)
)

insert into #temp
select N'䅇'
union all
select N'库'
;

select * from #temp

测试结果展示

从结果展示来看,生僻字“䅇 (su)”已经可以成功展示出来了,这里需要特别强调两点,否则很有可能展示出来还是乱码:

  • 数据类型选择请务必使用Unicode编码格式的类型,这里选择的是NVARCHAR。
  • 在向Unicode编码格式的数据类型插入数据时,需要使用前置词N。N前置词代表的是 SQL-92标淮中的国家语言,且N必须为大写。如果您没有在Unicode字串常数前面加上N做为前置词,则SQL Server会在使用字串前,先将其转换成目前资料库的非Unicode 字码页。

写在最后

至此,菜鸟成功复盘并解决了RDS SQL Server 2008 R2遭遇生僻字乱码的问题。又开始回过头来继续SQLTest系列,革命尚未成功,同志还需努力。

时间: 2024-09-30 22:55:09

RDS SQL SERVER 解决中文乱码问题的相关文章

SQL Server 2005 中文乱码解决

中文存到数据库中总是显示乱码.DEBUG发现页面中文到Service都是正确的中文. 解决办法: 1.关闭所有与此数据库的相关连接或者会话或者相关程序 2.然后将  SQL_Latin1_General_CP1_CI_AS 修改为 Chinese_PRC_CI_AS ( alter database db_namecollate Chinese_PRC_CI_AS ) 属性->选项 3.将varchar类型修改为nvarchar 就没问题了.或者.如果表里面没有数据的话,把表结构重新建立,建表的

SQL Server插入中文数据后出现乱码

原文:SQL Server插入中文数据后出现乱码 今天在做项目的过程中遇到如标题的问题,情况如下图: 数据库使用的是SQL Server2012版本,创建表的脚本如下: CREATE TABLE [dbo].[Type](  [TypeId] INT NOT NULL PRIMARY KEY,     [TypeName] NVARCHAR(50)NOT NULL,     [Description] NVARCHAR(255) NULL,     [CategoryId] INT NOT NU

RDS SQL Server - 专题分享 - 巧用执行计划缓存之索引缺失

title: RDS SQL Server - 专题分享 - 巧用执行计划缓存之索引缺失 author: 风移 摘要 执行计划缓存是MSSQL Server内存管理十分重要的部分,同样如何巧用执行计划缓存来解决我们平时遇到的一系列问题也是一个值得深入研究的专题.这篇文章是如何巧用执行计划缓存的开篇,分享如何使用执行计划缓存来分析索引缺失(Missing Indexes). 问题引入 缺失索引是SQL Server CPU使用率居高不下的第一大杀手,也是SQL Server数据库非常大的潜在风险点

RDS SQL Server - 最佳实践 - 高CPU使用率系列之索引缺失

摘要 CPU高使用率往往会导致SQL Server服务响应缓慢,查询超时,甚至服务挂起僵死,可以说CPU高使用率是数据库这种后台进程服务的第一大杀手.本系列文章之一的"索引缺失"就是CPU高使用率的最常见的原因之一. 问题引入 "鸟啊,我们平时在服务阿里云RDS SQL Server客户的过程中,遇到最多的一个问题就是,客户反馈RDS SQL Server数据库CPU使用率很高(有时超过90%,甚至到100%),导致查询缓慢甚至超时,这类问题要如何解决啊?".老鸟已

RDS SQL Server死锁(Deadlock)系列之五利用Extended Events获取死锁信息

问题引入 在过去很长一段时间,不断有客人会问道:"在事先没有任何跟踪或者监控部署的情况下,阿里云RDS SQL Server有没有办法获取到历史死锁信息,供我们分析?".在写到RDS SQL Server死锁系列文章之五时,我们就可以使用Extended Events来解决这个问题. 分析问题 Extended Events是微软从SQL Server 2008版本开始引入的,其中有一个默认事件会话是system_health,它的作用是用来收集SQL Server发生的错误信息,以X

RDS SQL Server - 最佳实践 - 高CPU使用率系列之非SARG查询

摘要 阿里云RDS SQL Server客户遇到最多的一个问题便是高CPU使用率导致导致SQL Server服务响应缓慢,查询超时,甚至服务挂起僵死.本系列文章第四篇分析非SARG查询导致CPU的高利用率的解决之道. 问题引入 "鸟啊,你听说过RDBMS的非SARG查询语句吗?我还是今天第一次听说呢!".老鸟有些不解的问菜鸟. "哈哈,鸟哥,孤陋寡闻,土鳖了吧.它可是导致RDBMS数据库CPU高使用率的又一个重要的原因呢!今天就让我细细道来.",菜鸟开始得意忘形起来

RDS SQL Server死锁(Deadlock)系列之二使用Profiler捕获死锁

问题引入 不管是RDS SQL Server还是自建SQL Server数据库,死锁的确是一个非常头疼的问题,上一篇文章我们已经谈到了使用DBCC捕获死锁.这篇文章是以阿里云RDS客户遇到的死锁问题为背景,分享死锁文章系列之二使用Profiler捕获死锁. Profiler捕获死锁 使用Profiler工具的Deadlock graph事件,可以非常方便直观的捕获死锁信息.方法是: 开启MSSQL Profiler:开始 -> 运行 -> 键入profiler 新建Deadlock Gra

RDS SQL Server死锁(Deadlock)系列之三自动部署Profiler捕获死锁

问题引入 系列SQL Server死锁系列文章之二,讲的是如何手动部署Profiler来捕获死锁以及对死锁发时场景重现,这篇文章是将这个手动部署的过程自动化话,实现一键部署,既快捷方便,又简单适用.上一篇文章,参见:使用Profiler捕获死锁. 自动部署Profiler 废话不多说,直接上代码,只需要初始化下面的Profiler停止时间@stop_time即可: use master GO set nocount on declare @trace_folder nvarchar(256) ,

RDS SQL Server死锁(Deadlock)系列之一使用DBCC捕获死锁

问题引入 在日常运维阿里云RDS SQL Server产品过程中,经常会被客户问道:"应用程序被死锁报错啦?影响很大,到底是哪个进程导致了死锁发生的啊?怎么解决啊?怎么办呀?".从客户一连串的问题中,我们深刻体会到了死锁问题的紧迫性和影响之大.授人予鱼而不如授人予渔,RDS SQL Server死锁系列文章就是为了帮助客人彻底解决死锁问题为初衷而诞生的.本篇文章是系列文章的开篇,主要是讨论如何使用DBCC来捕获死锁信息,内容包括: DBCC捕获死锁 死锁测试 死锁分析 解决方法