暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 GaussDB数据库 2022-04-24
1677

文章转自华为云社区,作者:小糖饼最甜呀;原文链接:https://bbs.huaweicloud.com/blogs/349067

今天主要整理一下解决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

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论