下記のようなログがエラーとともに出力されAmazon Redshiftのオブジェクトやデータの参照ができないことがあります。
Error: java.sql.SQLException: [Amazon](500310) Invalid operation: String contains invalid or
unsupported UTF8 codepoints. Bad UTF8 hex sequence: 8c (error 3);
※"Bad UTF8 hex sequence: 8c"は参照しているAmazon Redshiftのオブジェクトの名称によって変化します。
原因:
下記の条件を全て満たす場合に発生します。
- YellowfinのインスタンスがUTF-8以外のエンコードで実行されている
使用中のエンコードの確認方法は下記の記事を参照してください。
Yellowfinインスタンスで使用しているシステムのエンコードの確認方法 - Amazon RedshiftにAmazon Redshift JDBCを使用して接続している
- Amazon Redshiftの日本語(マルチバイト)名のオブジェクトを参照している
YellowfinのインスタンスのエンコードはデフォルトではYellowfinインスタンスが起動しているOSのエンコードがJavaのデフォルトのエンコードとして引き継がれ、それがインスタンスのエンコードとなります。
RHEL系の日本語環境のOSのデフォルトエンコードはja-JP.UTF8、Windows系の日本語環境のOSのデフォルトエンコードはMS932です。
そのため、日本語環境のWindowsでYellowfinインスタンスを稼働させている場合はUTF-8と異なるためエラーが発生する確率が極めて高いです。
Amazon RedshiftおよびAmazon Redshift JDBCはデータ、オブジェクト名はUTF-8を扱う前提であり、また、UTF-8しか考慮がなされていません。そのためJDBCにエンコードを指定するパタメータも存在しません。
Amazon Redshift JDBCは処理を行う際にI/Oのエンコードとして実行中のJavaのデフォルトのエンコードを使用します。
OSがWindowsの場合のエンコードはMS932となり、Amazon Redshiftのマルチバイト名のオブジェクトはUTF-8で格納されているため参照するとエンコードエラーがJDBCから返されます。
LinuxでもOSの設定を変更してUTF-8以外のエンコードを指定した場合は同様のエラーが発生します。
回避方法:
YellowfinインスタンスのJavaオプションを指定してエンコードをUTF-8にすることで回避が可能です。
Windowsのサービスとして起動している場合は コマンドプロンプトで<インストールフォルダ>¥appserver¥bin フォルダに移動後にコマンド tomcat8w //ES//Yellowfin(またはtomcat 7w //ES//Yellowfin) を実行します。
表示されたサービスのプロパティの「Java」タブの「Java Option」欄に下記を追記します。
-Dfile.encoding=UTF-8
-Dsun.jnu.encoding=UTF-8
BAT起動の場合はcatalina.batに下記の行をJVMメモリの設定付近に追記します。
set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8
set JAVA_OPTS=%JAVA_OPTS% -Dsun.jnu.encoding=UTF-8
Linuxの場合は<インストールディレクトリ>/appserver/bin/catalina.shに下記の行をJVMメモリの設定付近に追記します。
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
JAVA_OPTS="$JAVA_OPTS -Dsun.jnu.encoding=UTF-8"
Yellowfinを再起動し、管理コンソースのシステム情報でfile.encoding、sun.jnu.encodingがUTF-8になっていることを確認します。
使用中のエンコードの確認方法は下記の記事を参照してください。
Yellowfinインスタンスで使用しているシステムのエンコードの確認方法