我们将迁移一个应用程序以使其支持Unicode,并且必须在整个数据库的Unicode字符集或存储在N [VAR] CHAR2中的Unicode列之间进行选择。

我们知道,如果选择NVARCHAR2,就不再可能使用Oracle Text为列内容建立索引,因为Oracle Text只能基于CHAR类型对列进行索引。

除此之外,从Oracle的可能性中收获时是否可能还会出现其他主要差异?

另外,是否可能在较新的Oracle版本中添加了一些新功能,但仅支持CHAR列或NCHAR列,但不同时支持这两个列?

谢谢您的回答。

请注意贾斯汀的回答:

谢谢您的回答。我将讨论您的观点,并适用于我们的案例:

我们的应用程序通常单独存在于Oracle数据库上,并负责
数据本身。其他连接到数据库的软件仅限于Toad,
Tora或SQL开发人员。

我们还使用SQL * Loader和SQL * Plus与数据库进行通信,以进行基本
声明或在产品版本之间进行升级。我们有
没有听说所有有关NVARCHAR2的软件存在任何特定问题。

我们也不知道客户中的数据库管理员会
喜欢在数据库上使用其他工具,这些工具无法支持
NVARCHAR2,我们并不真正担心它们的工具是否会中断,
毕竟,他们在工作上很熟练,并在必要时可以找到其他工具。

您的最后两点对于我们的案例更具洞察力。我们不使用很多
Oracle提供的内置软件包,但仍然会发生。我们将探索
问题。

如果我们的应用程序(使用Visual C++编译)使用wchar_t来执行操作,我们是否也可能会导致性能破坏?
存储UTF-16,必须对所有处理的数据执行编码转换吗?

最佳答案

如果您有其他选择,请对整个数据库使用Unicode字符集。这样总的来说,生活简直就是令人眼花easier乱。

  • 有很多第三方实用程序和库仅不支持NCHAR / NVARCHAR2列,或者使NCHAR / NVARCHAR2列的使用不愉快。例如,当您 Shiny 的新报告工具无法报告您的NVARCHAR2数据时,这将非常令人讨厌。
  • 对于自定义应用程序,使用NCHAR / NVARCHAR2列需要跳过一些箍,而使用CHAR / VARCHAR2 Unicode编码列则不需要。例如,在JDBC代码中,您将不断调用Statement.setFormOfUse方法。其他语言和框架将有其他陷阱。有些将相对有据可查,而另一些则相对模糊。
  • 许多内置程序包仅接受(或返回)VARCHAR2而不是NVARCHAR2。由于隐式转换,您仍然可以调用它们,但最终可能会遇到字符集转换问题。
  • 通常,能够避免数据库内的字符集转换问题并将这些问题放到数据库实际从客户端发送或接收数据的边缘,这使得开发应用程序的工作变得更加容易。调试由网络传输引起的字符集转换问题已足够进行工作-确定存储过程将VARCHAR2和NVARCHAR2中的数据连接起来并将结果存储在VARCHAR2中之前,某些数据已损坏,然后才可以通过网络发送该数据。令人发指。

  • Oracle设计了NCHAR / NVARCHAR2数据类型,用于以下情况:您试图与使用Unicode的新应用程序在同一数据库中支持不支持Unicode的遗留应用程序,并且对于以不同的方式存储某些Unicode数据的情况是有利的编码(即,您希望使用NVARCHAR2中的UTF-16编码而不是UTF-8编码存储大量日语数据)。如果您不处于这两种情况之一,并且听起来不像您那样,那么我将不惜一切代价避免使用NCHAR / NVARCHAR2。

    回应您的跟进



    您是什么意思“照顾数据本身”?我希望您不是在说您已将应用程序配置为绕过Oracle的字符集转换例程,而是自己进行所有字符集转换。

    我还假设您正在使用某种API /库来访问数据库,即使那是OCI。您是否研究过需要对应用程序进行哪些更改以支持NCHAR / NVARCHAR2,以及您使用的API是否支持NCHAR / NVARCHAR2?在C++中获取Unicode数据的事实实际上并不表示您不需要进行更改(可能很重要)以支持NCHAR / NVARCHAR2列。



    这些应用程序都可以与NCHAR / NVARCHAR2一起使用。 NCHAR / NVARCHAR2在脚本中引入了一些额外的复杂性,尤其是当您尝试编码数据库字符集中无法表示的字符串常量时。不过,您当然可以解决这些问题。



    虽然我确定您的客户可以找到其他处理数据的方法,但是如果您的应用程序不能很好地与他们的企业报告工具,企业ETL工具或碰巧遇到过的任何桌面工具配合使用,则很有可能客户将责备您的应用程序而不是他们的工具。它可能不会成为秀场停止者,但不必要地引起客户悲痛也没有任何好处。这可能不会促使他们使用竞争对手的产品,但不会使他们渴望拥抱您的产品。



    我不确定您在说什么“转换”。这可能会回到我最初的问题,即您是否要绕过Oracle的NLS层自行进行字符集转换。

    不过,我的底线是,根据您的描述,使用NCHAR / NVARCHAR2不会带来任何好处。使用它们有很多潜在的缺点。即使您可以消除与您的特定需求无关的99%的缺点,但是,您仍然面临着一种充其量只是两种方法之间的冲刺的情况。鉴于此,我宁愿采用最大程度地提高灵活性的方法,也就是将整个数据库转换为Unicode(大概是AL32UTF8)并使用它。

    关于oracle - Oracle Text不适用于NVARCHAR2。还有什么可能不可用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4401043/

    10-11 16:30