Java 我应该使用JDBC getNString()而不是getString()吗?
我们正在构建一个由Oracle数据库支持的Java应用程序,我们使用JDBC访问该数据库(driversJava 我应该使用JDBC getNString()而不是getString()吗?,java,oracle,jdbc,nvarchar,Java,Oracle,Jdbc,Nvarchar,我们正在构建一个由Oracle数据库支持的Java应用程序,我们使用JDBC访问该数据库(driversojdbc6.jar和orai18n.jar)。数据库模式主要使用nvarhar2数据类型存储文本列 JDBCResultSet的说明是getNString()特别适用于NCHAR、NVARCHAR等数据类型,但目前我们只使用getString() 这似乎很好,所以我想知道为什么我应该使用getNString()而不是getString()。如果输入非ASCII字符,getString()是否
ojdbc6.jar
和orai18n.jar
)。数据库模式主要使用nvarhar2
数据类型存储文本列
JDBCResultSet
的说明是getNString()
特别适用于NCHAR、NVARCHAR等数据类型,但目前我们只使用getString()
这似乎很好,所以我想知道为什么我应该使用getNString()
而不是getString()
。如果输入非ASCII字符,getString()
是否将开始失败,或者Oracle JDBC驱动程序是否对我应该使用哪种方法漠不关心
编辑:似乎它可能依赖于数据库:,具体取决于连接参数。有人有关于Oracle的任何特定信息吗?如果您的数据库使用的是
nvarhar2
数据类型,它被设计用于存储多语言数据。如果这些列中存储了任何unicode数据,则程序将中断。如果我是你,我会转向getNXXX()
方法我已经对我们的应用程序进行了测试,似乎getNString()
对于Java 6、JDBC 6、Oracle JDBC 6驱动程序和Oracle 11.1.0.6.0是不必要的。我使用的测试管柱是“Δ,Й,ק, م, ๗, あ, 叶, 葉, 及말", 抄袭自
我们的大部分数据访问都是通过存储过程完成的。Java能够通过setObject()
和getString()
(出于抽象原因,不是setString()
)正确地设置和检索上述测试字符串,从接口收集数据并按预期将其写回接口
因此,
getString()
对于Oracle 11g的Unicode数据可以正常工作(就像上面链接中的SQL Server),因此我们将继续使用它,而不是getNString()
我建议您将该测试添加到您的回归套件中,以防它在Oracle或Oracle的未来版本中发生更改Java@artbristol-这是一个非常好的主意。即使是Oracle配置的更改也可能导致回归(尽管我没有理由相信,除了Oracle配置的经验)这表明Java设计的API很糟糕。您无法在sql server中安装varchar列。因此没有全局解决方案。oracle Java驱动程序处理nvarchar-varchar转换,但mssql驱动程序不处理