如何在查询级别将DB2二进制数据转换为UTF-8

o2g1uqev  于 2022-11-07  发布在  DB2
关注(0)|答案(3)|浏览(433)

我用java连接到IBM DB2数据库,但数据在数据库中以二进制格式存储,所以当我获取任何值时,它都是二进制或十六进制格式。我如何在查询级别将其转换为UTF-8中的二进制数据。
提取数据的示例代码-

String sql = "SELECT poMast.ORDNO  from AMFLIBL.POMAST AS poMast ";
Class.forName("com.ddtek.jdbc.db2.DB2Driver");
String url = "jdbc:datadirect:db2://hostname:port;DatabaseName=dbName;";
Connection con = DriverManager.getConnection(url, "username","password");
PreparedStatement preparedStatement = con.prepareStatement(sql);
ResultSet rs = preparedStatement.executeQuery();
System.out.println("ResultSet : \n");
System.out.println(" VNDNO");
while (rs.next())
{
   System.out.println(rs.getString("ORDNO"));
}
2ledvvac

2ledvvac1#

您可能需要使用CAST表达式:

SELECT CAST(poMast.ORDNO as VARCHAR(50))  from AMFLIBL.POMAST AS poMast

根据需要调整VARCHAR的长度。字符串在数据库代码页中(现在通常是UTF-8),并在获取时转换为客户端/应用程序代码页。

6ovsh4lw

6ovsh4lw2#

您可以将select的结果“转换”为utf8,如下所示。

String sql = "SELECT poMast.ORDNO, CAST(poMast.ORDNO AS VARCHAR(255) CCSID UNICODE) FROM AMFLIBL.POMAST AS poMast ";

源代码:cast db2

yshpjwxd

yshpjwxd3#

在我的例子中,错误的UTF-8数据不知何故进入了1208/UTF-8数据库的varchar中。在转换之前,当通过JDBC驱动程序查询此类数据时,数据库通过JDBC驱动程序返回-4220。通过添加以下属性,可以在JDBC驱动程序级别修复此问题:我的应用程序请参见:https://www.ibm.com/support/pages/sqlexception-message-caught-javaiocharconversionexception-and-errorcode-4220
Db2 LUW命令行处理器很久以前就将其修复为APAR,因此只有在未设置上述属性时,才能通过JDBC驱动程序看到此错误。
但是,如果您想修复数据库中的数据,可以使用以下方法:

update <table_name> set <bad_data_col> = cast(cast( <bad_data_col> as vargraphic) as varchar);

1st db2将错误数据作为“任何内容”的二进制文件进行处理(转换),然后将其转换(转换)回有效的UTF-8。转换后,JDBC驱动程序显示相同的结果(无论是否设置特殊属性),并且不返回任何错误。

相关问题