开发者社区 问答 正文

解决 SQL Server 表中的中文乱码问题



背景信息


用户在查询 SQL Server 表中的生僻字时,查询结果出现乱码。本文将介绍该问题的原因以及解决方法。

问题复现示例


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

  1. [backcolor=transparent]use[backcolor=transparent] tempdb
  2. [backcolor=transparent]go
  3. [backcolor=transparent]IF OBJECT_ID[backcolor=transparent]([backcolor=transparent]'#temp'[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]'U'[backcolor=transparent])[backcolor=transparent] IS NOT NULL
  4. [backcolor=transparent]    DROP TABLE [backcolor=transparent]#temp
  5. [backcolor=transparent]GO
  6. [backcolor=transparent]create table [backcolor=transparent]#temp(
  7. [backcolor=transparent]firstName varchar[backcolor=transparent]([backcolor=transparent]10[backcolor=transparent])
  8. [backcolor=transparent])
  9. [backcolor=transparent]insert [backcolor=transparent]into[backcolor=transparent] [backcolor=transparent]#temp
  10. [backcolor=transparent]select[backcolor=transparent] [backcolor=transparent]'䅇'
  11. [backcolor=transparent]union[backcolor=transparent] all
  12. [backcolor=transparent]select[backcolor=transparent] [backcolor=transparent]'库'
  13. [backcolor=transparent];
  14. [backcolor=transparent]select[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent] [backcolor=transparent]from[backcolor=transparent] [backcolor=transparent]#temp

显示结果如下,“䅇 (su)”字并未正确显示,而是出现了问号“?”。


原因分析


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)”。
  1. [backcolor=transparent]use[backcolor=transparent] tempdb
  2. [backcolor=transparent]go
  3. [backcolor=transparent]IF OBJECT_ID[backcolor=transparent]([backcolor=transparent]'#temp'[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]'U'[backcolor=transparent])[backcolor=transparent] IS NOT NULL
  4. [backcolor=transparent]    DROP TABLE [backcolor=transparent]#temp
  5. [backcolor=transparent]GO
  6. [backcolor=transparent]create table [backcolor=transparent]#temp(
  7. [backcolor=transparent]firstName nvarchar[backcolor=transparent]([backcolor=transparent]10[backcolor=transparent])
  8. [backcolor=transparent])
  9. [backcolor=transparent]insert [backcolor=transparent]into[backcolor=transparent] [backcolor=transparent]#temp
  10. [backcolor=transparent]select[backcolor=transparent] N[backcolor=transparent]'䅇'
  11. [backcolor=transparent]union[backcolor=transparent] all
  12. [backcolor=transparent]select[backcolor=transparent] N[backcolor=transparent]'库'
  13. [backcolor=transparent];
  14. [backcolor=transparent]select[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent] [backcolor=transparent]from[backcolor=transparent] [backcolor=transparent]#temp

显示结果如下,“䅇 (su)”字正确显示出来了。


展开
收起
云栖大讲堂 2017-10-18 16:24:05 3522 分享 版权
0 条回答
写回答
取消 提交回答
问答标签:
问答地址: