小白菜系列之——SQLServer乱码问题

举报
小糖饼最甜呀 发表于 2022/04/21 22:56:30 2022/04/21
【摘要】 今天主要整理一下解决SQLServer中文乱码的过程。本人一名数据库小白,挣扎于读取数据库乱码的问题中。在做这个功能时,走了很多弯路。因为没有数据库知识,一开始并不清楚系统库的存在,再到后来因为SQLServer数据库的数据类型导致的问题困惑了好久。所以总结记录一下。先简单描述一下背景:做一个功能,通过连接数据库,访问数据库表以及显示表字段注释的功能。遇到的问题,成功读取表字段和字段的注释,...

今天主要整理一下解决SQLServer中文乱码的过程。

本人一名数据库小白,挣扎于读取数据库乱码的问题中。在做这个功能时,走了很多弯路。因为没有数据库知识,一开始并不清楚系统库的存在,再到后来因为SQLServer数据库的数据类型导致的问题困惑了好久。
所以总结记录一下。

先简单描述一下背景:

  • 做一个功能,通过连接数据库,访问数据库表以及显示表字段注释的功能。
  • 遇到的问题,成功读取表字段和字段的注释,但是中文显示乱码,未能找到有效解决。

在我查询了n多网页后,依然无所收货,找不到解决方法。搜索无效,只能自己慢慢解决。一开始怀疑是我使用QT处理中文的问题,而当将QT常用的处理乱码的方式一一试验后,将怀疑指向了别处。

第一步,查询数据库表中含有中文的字段,发现中文显示正常。排除了QT代码处理的原因。
此时我怀疑,是系统表与普通表不一样吗?

第二步,因为怀疑与普通表不一样,需要先找到系统库。
读取数据库表的字段需要访问系统库,我使用的数据库查询软件并没有找到系统库相关内容,随即登录数据库服务器,把树状列表依次点了点,发现系统库在视图—》系统视图的节点下。(现在发现,准确来说,不应该叫系统库,而是系统视图啦。)

第三步,查询系统库的字段的属性。
我发现系统库sys.extended_properties的value字段(该字段存储字段的注释)的属性中,排序规则是空,但是该数据库的排序规则是Chinese_PRC_CI_AS。该数据库规则是没有问题的。

第四步,查询其他系统库的字段。
我通过访问系统库sys.table的name字段(该字段存储表名),发现汉字可以正常显示,此时,感觉发现了曙光。

第五步,比较不同。
我开始比较sys.table的name字段与sys.extended_properties的value字段这两个字段的区别。发现,两个系统库字段的数据类型是不一样的。
字段value的是数据类型是:sql_variant
字段name的数据类型是:nvarchar

第六步,转换类型。
查看数据类型sql_variant,发现需要先通过convert函数进行数据类型转换,转换成原始类型。
SELECT CONVERT(nvarchar(200), value) as remark from sys.extended_properties

最后,注释中的中文可以显示正常。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。