小白菜系列之——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
最后,注释中的中文可以显示正常。
- 点赞
- 收藏
- 关注作者
评论(0)