天天看点

【RDS SQL Server】如何解决 SQL Server 表中的中文乱码问题

问题复现示例

执行如下代码,查询 SQL Server 表中的生僻字“䅇 (su)”。

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】如何解决 SQL Server 表中的中文乱码问题

原因分析

SQL Server 使用 Unicode 编码格式的数据类型(例如 NCHAR、NVARCHAR)来支持包含中文在内的亚洲语言。在查询代码中,数据类型必须是 Unicode 编码的数据类型。但在上述示例代码中使用的数据类型是 VARCHAR,所以导致查询结果出现乱码。

解决方法

要解决在 SQL Server 的表中查询生僻字出现乱码的问题,只需要将上述示例代码中的数据类型改为 Unicode 编码格式的数据类型即可(下述示例中使用的是 NVARCHAR)。

另外,为避免乱码问题,在向 Unicode 编码格式的数据类型插入数据时,需要使用前置词 N。前置词 N 代表的是 SQL-92 标淮中的国家语言,且 N 必须大写。若您没有在 Unicode 字符串的常数前加 N 做为前置词,则 SQL Server 会在使用字符串之前将其转换成目前资料库的非 Unicode 字码页。

操作步骤

将上述示例中的数据类型 VARCHAR 改为 NVARCHAR,执行如下代码,查询 SQL Server 表中的生僻字“䅇 (su)”。

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)”字正确显示出来了。

【RDS SQL Server】如何解决 SQL Server 表中的中文乱码问题