用户在查询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)”字并未正确显示,而是出现了问号“?”。

分析原因

SQL Server使用Unicode编码格式的数据类型(例如NCHARNVARCHAR)来支持包含中文在内的亚洲语言。在查询代码中,数据类型必须是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)”字被正确查询出。