背景信息
用户在查询 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)”字并未正确显示,而是出现了问号“?”。
[url=http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/pic/50833/cn_zh/1487667059701/rds_best_practice_messy_code.png][/url]
原因分析
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)”字正确显示出来了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。