現在、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&characterEncoding=utf8
として指定し、my.ini
ファイル(およびMySQL Workbench)で再生して、データベース内のすべてをutf8
文字セットに強制的に設定しました。最大の頭痛:<property name="connectionProperties" value="useUnicode=yes;characterEncoding=utf8" />
を追加。結局のところ、単一のBean内で2つのconnectionPropertiesを設定することは文字通り不可能です。なぜなら、どこにも言及されている分離文字がないためです(BeanはuseUnicode
の値としてyes;characterEncoding=utf8
を設定しようとしてそれを読み取ろうとします)。だから私の質問は次のとおりです。
問題は、utf8ではなくUTF-8を指定することで発生する可能性があります。から 文字セットとUnicodeを使用 :
クライアント側で文字エンコーディングを指定するときは、Javaスタイルの名前を使用してください。次の表に、MySQLの文字セット名と対応するJavaスタイル名を示します...
utf8はUTF-8にマッピングされます。次のJDBC URLを試してください。
jdbc:mysql:// localhost:3306 /?useUnicode = yes&characterEncoding = UTF-8
試しましたか:
<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;
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
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サービスを再起動することを忘れないでください。