当前位置: 首页 > 面试题库 >

结合使用Types.NVARCHAR和oracle JDBC驱动程序来处理西里尔字符

薛宇
2023-03-14
问题内容

我正在尝试使用“ JDK
1.6中的国家字符集类型数据的新方法”
来获取处理西里尔字符的
标准JDBC 解决方案,但是当执行达到任何具有NVARCHAR类型的行时,例如:

preparedSelect.setObject(3, "褋褍斜斜芯褌邪", Types.NVARCHAR);

然后我得到这个异常:

java.sql.SQLException: Invalid column type
    at oracle.jdbc.driver.SQLStateMapping.newSQLExcepthtml" target="_blank">ion(SQLStateMapping.java:70)
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:131)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:197)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:261)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:269)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:490)
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:7922)
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:7502)
    at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:7975)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:222)

我也尝试使用setNString(),但是得到了一个更奇怪的异常:

java.lang.AbstractMethodError: oracle.jdbc.driver.OraclePreparedStatementWrapper.setNString(ILjava/lang/String;)V

如果我将java -Doracle.jdbc.defaultNChar = true
myApplication与常规Types.VARCHAR一起使用,则俄语单词会正确存储。但是,不能使用-Doracle.jdbc.defaultNChar
= true,因为我正在处理旧版应用程序,我无法控制正在运行的生产环境,我只是向其中编写一个组件。此外,此“
NChar操作方法自述文件”指出“此转换对性能有重大影响”。因此,当只有不到1%的表需要这种转换时,默认情况下将所有内容都设置为NChar并不是明智的选择。

我正在使用oracle瘦驱动程序,并且我的类路径中有ojdbc6.jar和orai18n.jar。

我正在寻找一个标准的JDBC解决方案。我不能在它们上使用带有“
oracle”的任何方法或常量。OraclePreparedStatement对我来说不是一个选择。

我尝试将Types.NVARCHAR与MSSQL Server一起使用,并且运行良好。


问题答案:

我找到了解决方案!

我正在使用ojdbc
11.2.0.1。当我切换到11.2.0.2时,我可以setNString()正常工作。但是java.sql.SQLException: Invalid column type如果setObject()与一起使用,我仍然会得到相同的结果Type.NVARCHAR。真是可惜,甲骨文…

无论如何,解决方案:切换到ojdbc 11.2.0.2



 类似资料:
  • 我是Gradle项目的新手,我有一个问题。我在网上搜索过,但找不到我需要的东西,或者我不知道如何搜索。首先我要告诉你我的情况。我有一个Gradle项目,我想在将来与jenkins一起执行几个自动化测试,但现在我想在Eclipse上进行尝试。我在/lib目录中有oracle jdbc驱动程序,这是我的构建。格拉德尔 我想在一个类中使用这个jdbc驱动程序,但我不知道如何使用它。当我尝试使用Maven

  • 我正在解析一个xml文件,但西里尔字符有问题: 这是存储过程的相关部分 要解析的SOAP输入: 存储过程 问题是@s看起来是这样的 我把N放在所有输入的前面,但问题显然在前面:我可以假设是在 但我不知道如何解决它。 可以提出解决方案吗? 谢谢

  • 问题内容: 我正在尝试使用php的函数json_encode将西里尔UTF-8数组编码为JSON字符串。示例代码如下所示: 它工作正常,但脚本的结果表示为: 每个西里尔字母组成6个字符。有没有一种方法可以获取键/值对的原始字符,而不是编码的字符? 问题答案: 您不能在此处使用JSON_UNESCAPED_UNICODE常量吗?

  • 问题内容: 当用户在数据库中插入俄语单词如“锌褉松弛屑械Russian”时,数据库将其保存为“ ??????”。如果他们以’N’字母插入,或者我以’N’字母进行选择,即;exec Table_Name N’没有问题。但是我不想在每个查询中都使用“ N”,因此对此有什么解决方案吗?顺便说一下,我将使用存储过程。 更新: 现在,我可以使用带有排序规则的俄语字母。但是我无法更改每种语言的排序规则,我只想

  • 问题内容: 我正在尝试使用switch来发出警报并执行操作,但是我遇到了错误。 现在真正的问题是当我将下面的代码放入try中时,catch可以正常工作。我的意思是它可以完美地处理警报。但是当我不经尝试使用相同代码时,捕获代码将引发以下异常 请在下面找到错误 问题答案: 这个想法是当您处理警报时,您必须先检查警报是否存在。我会使用这种方法: 在这里您可以获得详细信息,也不要忘记逐步调试以了解出现/不