Oracle文本无法与NVARCHAR2一起使用。还有什么是不可用的?

Oracle文本无法与NVARCHAR2一起使用。还有什么是不可用的?,oracle,unicode,character-encoding,nvarchar,Oracle,Unicode,Character Encoding,Nvarchar,我们将迁移一个应用程序,使其支持Unicode,并且必须在整个数据库的Unicode字符集或存储在N[VAR]CHAR2中的Unicode列之间进行选择 我们知道,如果选择NVARCHAR2,我们将不再可能使用Oracle文本对列内容进行索引,因为Oracle文本只能基于CHAR类型对列进行索引 除此之外,从Oracle的可能性中获取信息时,是否可能会出现其他主要差异 此外,是否可能在较新版本的Oracle中添加了一些新功能,但只支持CHAR列或NCHAR列,而不同时支持两者 谢谢你的回答 请注

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

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

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

此外,是否可能在较新版本的Oracle中添加了一些新功能,但只支持CHAR列或NCHAR列,而不同时支持两者

谢谢你的回答

请注意以下Justin的回答: 谢谢你的回答。我将针对我们的案例讨论您的观点:

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

我们还使用SQL*加载器和SQL*Plus与数据库进行基本的通信 语句或在产品版本之间升级。我们有 没有听说过关于NVARCHAR2的所有软件有任何具体问题

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

你的最后两点对我们的情况更具洞察力。我们不使用很多 Oracle的内置软件包,但这种情况仍然存在。我们将对此进行探讨 问题

如果我们的应用程序(在Visual C++下编译)使用
wchar\u t

存储UTF-16时,必须对所有处理过的数据执行编码转换?

如果您有任何选择,请对整个数据库使用Unicode字符集。总的来说,那样的话,生活就容易多了

  • 有很多第三方实用程序和库根本不支持NCHAR/NVARCHAR2列,或者使用NCHAR/NVARCHAR2列并不令人愉快。例如,当您闪亮的新报告工具无法报告您的NVARCHAR2数据时,这非常烦人
  • 对于自定义应用程序,使用NCHAR/NVARCHAR2列需要跳过一些使用CHAR/VARCHAR2 Unicode编码列所没有的障碍。例如,在JDBC代码中,您经常调用Statement.setFormOfUse方法。其他语言和框架将有其他的陷阱;有些文件记录得比较好,有些则比较模糊
  • 许多内置软件包只接受(或返回)VARCHAR2而不是NVARCHAR2。由于隐式转换,您仍然可以调用它们,但最终可能会出现字符集转换问题
  • 一般来说,能够避免数据库中的字符集转换问题,并将这些问题转移到数据库实际从客户机发送或接收数据的边缘,这使得开发应用程序的工作更加容易。调试由网络传输引起的字符集转换问题已经足够了——要知道,当存储过程将来自VARCHAR2和NVARCHAR2的数据连接起来并在通过网络发送之前将结果存储在VARCHAR2中时,某些数据被破坏了,这可能会非常痛苦
Oracle设计的NCHAR/NVARCHAR2数据类型适用于您试图在同一数据库中支持不支持Unicode的旧应用程序的情况,以及使用Unicode的新应用程序,以及使用不同编码存储某些Unicode数据的情况(即,您有大量的日语数据,希望使用UTF-16编码存储在NVARCHAR2中,而不是UTF-8编码)。如果您不在这两种情况中的任何一种情况下,而且听起来不像,我会不惜一切代价避免NCHAR/NVARCHAR2

回应你的后续行动

我们的申请通常是单独提交的 Oracle数据库并负责 数据本身。其他软件 连接到数据库仅限于 Toad、Tora或SQL开发人员

你说的“处理数据本身”是什么意思?我希望你不是说你已将应用程序配置为绕过Oracle的字符集转换例程,而你自己完成所有字符集转换

我也假设你使用某种API /库访问数据库,即使是OCI。你是否已经查看过你需要对应用程序做什么改变来支持NCHAR/NVARCHAR2,以及你使用的API是否支持NCHAR/NVARCHAR2?实际上,你在C++中获得Unicode数据实际上并没有说明。您不需要进行(潜在的重大)更改来支持NCHAR/NVARCHAR2列

我们还使用SQL*加载器和SQL*Plus 与数据库进行通信,以便 基本语句或之间的升级 产品的版本。我们没有 听说所有人都有什么特别的问题吗 那些关于NVARCHAR2的软件

这些应用程序都使用NCHAR/NVARCHAR2。NCHAR/NVARCHAR2会给脚本带来一些额外的复杂性,特别是当您试图对数据库字符集中不可表示的字符串常量进行编码时。不过,您当然可以解决这些问题

我们也不知道这个数据库 客户中的管理员 是否希望在上使用其他工具 无法支持数据的数据库 在NVARCHAR2上,我们不是真的 担心他们的工具是否会 打乱,毕竟他们很擅长 他们的工作,并可能找到其他工具,如果 必要的