Oracle 连接和 nls_lang
我有一个旧数据库集,其中 NLS_LANG 设置为 IW8ISO8859P8。 这我无法改变。
我有另一个应用程序,它不支持 unicode,但它处理的数据与我的应用程序处理的数据相同。 在某些字段中,有时,用户会插入代表 NIS 货币 simble 的字符 161 作为字符串的一部分。 当我尝试使用 oledb 从 .Net 读取这些数据时,一切都很好,但是当我尝试使用 oracle 客户端这样做时,我得到的却是垃圾数据。 另外,当我在 .Net 中插入 NIS simble 时,它会被保存为垃圾。
我知道我可以在获取数据后对其进行操作,但我正在寻找 .Net 中 oracle 客户端的一些配置以使其正常工作。
我已经为此工作了几个星期了,如有任何帮助,我们将不胜感激。 总氮 诺姆
I have a legacy database set with NLS_LANG set to IW8ISO8859P8. This I cannot change.
I have another application, that is not working with unicode, that works on the same data my application works on.
In some of the fields, and some of the times, the user inserts as part of a string, the character 161 which represents NIS currency simble.
When I try to read this data from .Net using oledb, all is well but when I try to do so with the oracle client, I get garbage data instead. also when I insert in .Net the NIS simble, it is saved as garbage.
I know I can manipulate the data after I got it, but I am looking for some configuration of the oracle client in .Net to get this to work.
I have been working on this for a few weeks now, any help would be appriciated.
Tnx
Noam
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你检查客户端上的nls_lang设置了吗? 对 nls 设置的任何更改都可以被客户端上的设置(注册表和环境)覆盖。 也许这就是你的问题的原因。
验证您在客户端上没有任何其他 nls 设置,并且没有人明确更改它。
您可以运行登录后触发器来更改会话格式。 这将确保服务器设置会影响所有客户端。
此外,请确保设置了 nls_territory。 它应该设置为 nls_lang 的一部分,但以防万一您指的是 nls_language。 我相信货币符号受此影响。
did you check the nls_lang setting on the client? Any changes to the nls setting can be overwritten by settings on the client (registry and environment). maybe this is the cause of your problem.
Verify that you don't have any other nls settings on the client and that non of you functions explicitly change it.
you can run an after logon trigger to change the session format. this will make sure that the server settings will affect all clients.
In addition, make sure that nls_territory is set. it should be set as part of the nls_lang but just in case you meant nls_language. I believe the currency symbol is affected by this.
最终我使用辅助 nvarchar 列解决了这个问题。 并触发器在它们之间进行翻译。
我在 plsql 中编写了一些函数,使用由许多 if 语句实现的自定义编码来执行与 Unicode 之间的字节转换。
对于包含有问题数据的每一列,我添加了带有 nvarchar 存储的第二列,以及使用该函数转换有问题数据的触发器。
因此,旧应用程序使用并更新 varchar 列,并且触发器将其转换为 Unicode 列。 .Net 代码使用 Unicode 列,触发器再次将信息转换为遗留应用程序中使用的有问题的编码。
如果您需要更多信息,请随时与我联系以获取更多信息
At the end of the day I solved it using a secondary nvarchar column. and triggers to translate between them.
I have written functions in plsql that do a byte conversion to and from Unicode, using a custom encoding realized by many many if statements.
And for each column with the problematic data I added a second column with nvarchar storage, and triggers that uses that function to translate the problematic data.
So the legacy applications uses and updates the varchar columns, and the triggers translate it to the Unicode columns. and the .Net code uses the Unicode columns, and again the triggers translate the info to the problematic encoding used in the legacy application.
If you need more info, please feel free to contact me for more information
您是否看过 Oracle 的 NLS_LANG 常见问题解答< /a>?
Have you looked at Oracle's NLS_LANG FAQ?