使用流利的 Nhibernate 插入时,Oracle DB 法语字符将替换为垃圾值

Posted

技术标签:

【中文标题】使用流利的 Nhibernate 插入时,Oracle DB 法语字符将替换为垃圾值【英文标题】:Oracle DB french character are replacing with junk values when inserting using fluent Nhibernate 【发布时间】:2018-07-14 06:37:21 【问题描述】:

我正在使用 Fluent Nhibernate 来管理数据库活动。当我尝试使用流利的 Nhibernate 在 Oracle DB 中插入法语字符时,一些字符被垃圾值替换。

eg:- "général" 转换为 "general" 或 "g?n?ral"

列的数据类型是NVARCHAR2

NLS_CHARACTERSET=US7ASCII

NLS_NCHAR_CHARACTERSET=AL16UTF16.

当我直接在 plsql 中执行时,下面的查询插入了正确的值。

update table_name set test_col=N'général' where id='1';

    如何在 C# 中流畅的 Nhibernate 中执行此查询?

    在Oracle数据库中插入特殊法语字符是否有其他解决方案?

【问题讨论】:

Oracle Connection 使用哪个提供程序? Oracle.ManagedDataAccess.Client. 你确定Oracle.ManagedDataAccess.Client?那么你不应该有这个问题。我对NLS_LANG 的建议也不会产生任何影响,请参阅Data Provider for .NET Developer's Guide 【参考方案1】:

我假设您使用的是 ODP.NET 提供程序 (OracleDataClientDriver : Oracle.DataAccess)。在这种情况下,您的 NLS_LANG 环境变量的值是多少?

很可能没有定义,Oracle 将其默认为AMERICAN_AMERICA.US7ASCII。 但是US7ASCII 不支持任何重音字符。使用支持它们的字符集,例如AL32UTF8WE8ISO8859P1WE8MSWIN1252

如果您使用NHibernate.Driver.OracleClientDriver 驱动程序,您应该更改为其他驱动程序之一,因为基本System.Data.OracleClient 是deprecated 很长时间了。

【讨论】:

感谢您的快速回复。 我觉得你的建议对我有用。我搜索了有关字符集迁移的信息。我可以看到从一个字符集迁移到另一个字符集时可能会遇到一些困难。比如截断数据和身份验证问题等。你认为从 US7ASCII 迁移到 AL32UTF8 或 WE8ISO8859P1 或 WE8MSWIN1252 是否可以。 US7ASCII,您可以迁移到任何东西而不会丢失数据。但是,由于您的数据类型是 NVARCHAR2,因此 NLS_NCHAR_CHARACTERSET 应用。 AL16UTF16NLS_NCHAR_CHARACTERSET 最常见的字符集,所以很可能这不会改变。

以上是关于使用流利的 Nhibernate 插入时,Oracle DB 法语字符将替换为垃圾值的主要内容,如果未能解决你的问题,请参考以下文章

流利的NHibernate中的层次零对一关系

使用流利的 nhibernate 映射枚举

流利的 NHibernate 多对多创建附加表

使用流利的nhibernate映射枚举

如何使用流利的 nhibernate 设置 generate_statistics = true

流利的nhibernate映射多对多配置错误