从DataGrip访问DB2数据库时发生java.io.CharConversionException
故障排除
问题
DataGrip 使用 IBM Data Server Driver for JDBC and SQLJ的应用程序访问对字符数据使用双字节字符集编码的数据库 (例如CCSID 1399-日语)。在JRE 1.8或更高版本下运行时,应用程序会收到 SQL异常,在查询字符数据时显示消息 “捕获java.io.CharConversionException” 和ERRORCODE =-4220。
症状
抛出的异常与此类似:
[jcc][t4][1065][12306][4.26.14] 捕获到 java.io.CharConversionException。有关详细信息,请参阅相连接的 Throwable。 ERRORCODE=-4220, SQLSTATE=null.
原因
IBM Data Server Driver for JDBC and SQLJ依赖于Java运行时进行字节到字符的转换。该错误是由于在JRE 1.7和更低版本中的Java字符转换器接受的字符数据中存在特定的字节序列,但在使用java的JRE 1.8中被视为无效并被拒绝io.charConversionException。
环境
DataGrip 2024.3.X
诊断问题
您可以使用十六进制函数找出字符列中数据的字节值:
例如,要找出表TAB1中COL1列中的字节值,请运行:
从表1中选择十六进制 (col1)
关于指定的字符集编码/CCSID,这可以帮助识别需要被纠正的无效字节序列。
解决问题
问题的解决方案是识别和纠正无效数据。
在修复无效数据之前,可以使用以下解决方法来保持应用程序的连续性:
- 设置驱动程序配置属性db2.jcc.charsetDecoderEncoder = 3 设置此属性后,驱动程序将指示Java字符转换器在无效字节序列的解码输出中使用替换 (虚拟) 字符,而不是抛出java.io.charConversionException异常。
DataGrip设置:
-
Right-click on the data source and go to Properties (Ctrl + Alt + Shift + S).
-
Go to the Advanced tab and add -Ddb2.jcc.charsetDecoderEncoder=3 in the VM Options as shown below.
-
Apply the settings.
-
Right-click on the data source again (Ctrl + Alt + Shift + S), navigate to Diagnostics, and select Force Refresh.