web-dev-qa-db-ja.com

Spring管理のMySQL JDBC接続でuseUnicode = trueおよびcharacterEncoding = utf8プロパティを設定する方法

現在、Spring MVC Webアプリを構築していますが、データベースは重要なバックエンド部分です。ただし、何らかの理由で、SpringはデータをUTF-8として処理することを拒否しています。ビュー、リソース、およびブラウザーはUnicodeに設定されているため、データベース内のテーブルも設定されているため(また、同様の質問をかなり読んでいます)、データベース接続に問題があることがわかりました。

JDBCドライバーは、connectionPropertiesで2つの項目を提供する必要があります。useUnicode(yesに設定)およびcharacterEncoding(utf8)。しかし、判明したのは不可能です。

JDBCはBeanであるため、XMLファイルを介して次のように構成されます。

<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/<database>" />
<property name="username" value="<not telling>" />
<property name="password" value="<not telling>" />

このセットアップは、データベースから取得したすべての英数字以外の文字(矢印やギリシャ文字など)を疑問符に変換します。これは明らかに、受け入れられません。

複数の解決策を試しました。JDBCURLをjdbc:mysql://localhost:3306/<database>?useUnicode=yes&amp;characterEncoding=utf8として指定し、my.iniファイル(およびMySQL Workbench)で再生して、データベース内のすべてをutf8文字セットに強制的に設定しました。最大の頭痛:<property name="connectionProperties" value="useUnicode=yes;characterEncoding=utf8" />を追加。結局のところ、単一のBean内で2つのconnectionPropertiesを設定することは文字通り不可能です。なぜなら、どこにも言及されている分離文字がないためです(BeanはuseUnicodeの値としてyes;characterEncoding=utf8を設定しようとしてそれを読み取ろうとします)。だから私の質問は次のとおりです。

19
Haxton Fale

問題は、utf8ではなくUTF-8を指定することで発生する可能性があります。から 文字セットとUnicodeを使用

クライアント側で文字エンコーディングを指定するときは、Javaスタイルの名前を使用してください。次の表に、MySQLの文字セット名と対応するJavaスタイル名を示します...

utf8UTF-8にマッピングされます。次のJDBC URLを試してください。

jdbc:mysql:// localhost:3306 /?useUnicode = yes&characterEncoding = UTF-8

35
hmjd

試しましたか:

<property name="connectionProperties">
    <props>
        <prop key="useUnicode">yes</prop>
        <prop key="characterEncoding">utf8</prop>
    </props>
</property>

また、DBに接続する単純なJavaクライアント(コンソールアプリケーション)を試しましたか?この場合、UTF-8は機能しますか?

Spring Bootを使用している場合、接続文字列に追加のパラメーターを追加する代わりに、application.properties内のプロパティを使用してこれを行うことができます。

これをapplication.propertiesに追加します。

spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8;
6
Conor O'Neill

Spring-boot +埋め込みH2 + Hibernateを使用しているときにも同じ問題が発生しましたが、問題はSQLスクリプトを読み込んだ瞬間にありました。 (data.sql)データベースのエンコードは、外部文字を読み取るたびに壊れていました。

Application.propertiesに次の行を追加すると、問題が解決しました。

spring.datasource.sqlScriptEncoding=UTF-8

可能な場合は、コンソールにアクセスして、いくつかのデータを手動で追加します。外国の文字が正しい方法で表示される場合。その後、この解決策はあなたのためにうまくいくかもしれません。

私はここでその解決策を見つけました:

http://ufasoli.blogspot.com/2014/07/spring-boot-jpa-broken-encoding-on.html

3
Kamil Kacperski

Utf-8テーブルを生成する時間を無駄にしました。上記のどれも私のために働いた。ついにmysqlの設定ファイルを変更しました。これは魅力のように機能します。 Linuxを使用している場合(私はUbuntuにいます。Windows用のファイルがあると確信しています)、ファイル/etc/mysql/my.cnfを開き、次のコードを追加します。

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

Mysqlサービスを再起動することを忘れないでください。

1
maruf571