暂无图片
请教有没有大神可以解决一下nodejs查询字符集是gbk的Oracle数据库时产生的乱码问题?
我来答
分享
Kevin Gee
2021-08-26
请教有没有大神可以解决一下nodejs查询字符集是gbk的Oracle数据库时产生的乱码问题?

nodejs只支持utf8,在Oracle数据库字符集是utf8时,环境变量设置nls_lang为utf8,可以正常查询到数据库中的中文数据
由于数据库中的数据是已经在使用的,重装数据库来改变字符集是难以实现的
如果数据库的字符集是gbk时,如果不在代码中对字符进行处理,nodejs查询到的中文数据就会显示乱码

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
Lucifer三思而后行
暂无图片

可以尝试修改数据库字符集。

暂无图片 评论
暂无图片 有用 0
打赏 0
暂无图片
Lucifer三思而后行
暂无图片

方案一:

UTF8包含了所有的GBK字符,不过只是编码不一样而已。字符集AL32UTF8和ZHS16GBK之间没有子集和超集的关系。

在已运行的数据库中,直接更改数据库字符集ZHS16GBK到AL32UTF8,中文字段无法匹配查询条件,例如name='张晓东’旧的数据无法查出,可以正常显示;但英文数字等可以正常匹配。

原来的gbk数据一个中文还是2个字节,新插入的变成3个字节;同时在数据库字符集为AL32UTF8,客户端为AL32UTF8可以保存及显示维文。

可见在保持字段类型varchar2不变的情况下,目前只能导出gbk库,再重新导入AL32UTF8库的方式,并将字段长度扩充为1.5倍;在导入的过程中,达到完成重新编码的目的。

方案二:

gbk库中将字段类型varchar2先修改为nvarchar2,在变更字符集AL32UTF8,可行。

两种字符集中nvarchar2,每个字符(英文,中文),都占2个字节,查询显示也正常。

因为nvarchar2使用的是国家字符集(非数据库字符集),默认为AF16UTF16。

经测试,nvarchar2在数据库字符集为AL32UTF8,客户端为AL32UTF8可以保存及显示维文;但客户端在ZHS16GBK环境下(非AL32UTF8),nvarchar2依然不能正常保存显示维文。

因为涉及字符集的变更,需要整理所有中文字段,进行更改字段类型的操作。

 或者在相关表,只对已知的需要存储显示外文的字段,新增备用字段nvarchar2,以便保存外文等的unicode字符,并将原数据同步到对应字段,以后的查询显示以此为准。
 这种对原数据库的改动是最小的,扩展性差,需要程序配合。当然也可以直接将字段类型修改为nvarchar2。

关于ZHS16GBK与AL32UTF8库的互相访问:

客户端(注册表)ZHS16GBK/AL32UTF8

1、数据库AL32UTF8下,pl/sql直接查询gbk库,显示中文还是2字节;但在存储过程中的查询得到的中文,变成3字节。
可见,原库中的存储过程,涉及到中文参数的地方也应该扩大长度1.5倍。

2、数据库gbk下,pl/sql直接查询AL32UTF8库,显示中文3字节;但在存储过程中的查询得到的中文,变成2字节。

3、维文只有在客户端,数据库都是AL32UTF8下,才能正常显示和保存。

结论:

AL32UTF8关联gbk库,查询显示,入库正常;依然注意中文长度变3字节的问题。

显示时是数据库字符集与客户端字符集的转换;数据库入库处理中,变成客户端字符集与数据库字符集的转换

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏