MySQLはこれが有効なUTF8テキストであるとは信じていません。同じ列定義(mysqlクライアント接続もUTF8)を使用してテストテーブルで挿入を試みましたが、挿入は行いましたが、MySQL CLIクライアントとJDBCで取得したデータが値を正しく取得しませんでした。UTF8が正しく機能することを確認するために、オバマ氏の「o」の代わりに「ö」を挿入しました。
johan@maiden:~$ mysql -vvv test < insert.sql
--------------
insert into utf8_test values(_utf8 "walmart öbama 👽💔")
--------------
Query OK, 1 row affected, 1 warning (0.12 sec)
johan@maiden:~$ file insert.sql
insert.sql: UTF-8 Unicode text
テストする小さなJavaアプリケーション:
package test.sql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Test
{
public static void main(String[] args)
{
System.out.println("test string=" + "walmart öbama 👽💔");
String url = "jdbc:mysql://hostname/test?useUnicode=true&characterEncoding=UTF-8";
try
{
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection c = DriverManager.getConnection(url, "username", "password");
PreparedStatement p = c.prepareStatement("select * from utf8_test");
p.execute();
ResultSet rs = p.getResultSet();
while (!rs.isLast())
{
rs.next();
String retrieved = rs.getString(1);
System.out.println("retrieved=\"" + retrieved + "\"");
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
出力:
johan@appel:~/workspaces/java/javatest/bin$ java test.sql.Test
test string=walmart öbama 👽💔
retrieved="walmart öbama "
また、JDBC接続で同じ挿入を試みたところ、同じ例外がスローされました。これはMySQLのバグだと思います。たぶん、そのような状況に関するバグレポートはすでにあるでしょう。