暂无图片
请教有没有大神可以解决一下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
回答交流
Markdown


请输入正文
提交
相关推荐
关于Oracle DG的归档目录问题
回答 2
已采纳
不需重启数据库(之前记错了),注意rac俩节点sid'',不影响dg
用户密码验证问题
回答 6
724小时的业务也可以申请一个停机维护时间既然密码错误,把所有连接的应用密码修改正确就可以了,应用如果较多,可以采用自动化脚本进行批量修改
连接Oracle数据库报错,ORA-89817,怎么办?
回答 3
磁盘空间满了,先删监听日志文件或者归档日志文件释放空间吧。
Oracle rman通道数量配置有什么建议?
回答 2
可以看看这篇文章,介绍的非常好https://www.modb.pro/db/43978
Oracle如何修改已有dblink中的连接串
回答 2
常用的就是删除重建
这道题错哪里了?
回答 1
已采纳
A.通过awrsqrpt.sql获取到的SQL的AWR报告:AWR(AutomaticWorkloadReplay)报告是Oracle数据库提供的一种工具,用于分析数据库的性能问题。awrsqrpt.
oracle数据库因tab$基表内容被删除导致数据库无法启动
回答 3
确定是tab$被删除了,可以尝试异机恢复之前的,然后手动导入tab$试试?谢谢!
医疗行业信息技术人员技术赋能在哪可以进入
回答 3
我也有兴趣,想去医疗行业
在数据库重启前有条sql执行时间很长,重启后快了很多
回答 1
已采纳
提供这么一种思路:你数据库长时间没重启,buffercache里有碎片,重启前,这个表涉及的block频繁被flush出去。重启后碎片少了,这个表的block可以在buffercache里保持住了。
一个麻烦的UNPIVOT实现
回答 4
不是很麻烦witht1as(selectregexpsubstr(ENTITYCODE,'[^]',1,2)ENTITYCODE,REPLACE(regexpsubstr(ENTITYCODE,'[^
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~