質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

3153閲覧

JavaServletでのデータベース更新時の文字化け問題

liuchao4664

総合スコア13

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2017/01/15 01:22

JSPからサーブレットにデータ(引数:t109003)を飛ばし、そのデータをデータベースに登録するコードを書きましたが、
日本語の部分は全部「?」になってしまいました。
データベースのコード、テーブルのコードをともにutf8に設定しておりますが、
いろいろ方法調べて、character_setの設定も全部utfに変えましたが、同じ文字化けが発生します。
テーブルの設定は以下の通りです:

Table: ten Create Table: CREATE TABLE `ten` ( `ten_id` int(11) NOT NULL DEFAULT '0', `ten_name` varchar(30) DEFAULT NULL, `ten_date` varchar(30) DEFAULT NULL, `ten_shipment` int(11) DEFAULT NULL, PRIMARY KEY (`ten_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

データベースの設定

+----------+-------------------------------------------------------------------+ | Database | Create Database | +----------+-------------------------------------------------------------------+ | satotest | CREATE DATABASE `satotest` /*!40100 DEFAULT CHARACTER SET utf8 */ | +----------+-------------------------------------------------------------------+

文字コードの設定:

+--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | C:\xampp\mysql\share\charsets\ | +--------------------------+--------------------------------+

なお、MYsqlを再起動したら元通りになります。

+--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | cp932 | | character_set_connection | cp932 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | cp932 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | C:\xampp\mysql\share\charsets\ | +--------------------------+--------------------------------+

サーブレットコード:

Connection con = null; try{ con = DBManager.getConnection(); String sql = "INSERT INTO ten (ten_id,ten_name,ten_date,ten_shipment) VALUES (555,'テスト2',?,?)"; PreparedStatement pstm = con.prepareStatement(sql); request.setCharacterEncoding("UTF-8"); int t109003 =0; request.getParameter("t109003"); t109003 = Integer.parseInt(request.getParameter("t109003")); System.out.println(t109003); pstm.setString(1, "1月13日"); pstm.setInt(2,t109003); pstm.executeUpdate(); }catch(Exception e){ e.printStackTrace(); }

登録したデータは以下のようになります:

+--------+----------+----------+--------------+ | ten_id | ten_name | ten_date | ten_shipment | +--------+----------+----------+--------------+ | 555 | ???2 | 1?13? | 4 | +--------+----------+----------+--------------+

皆様の知恵を、お貸しください。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

| character_set_server | latin1 |

ここがutf8になっておらずDBサーバーがASCII(?)以外を認識してくれないのが原因のように思えます。
自分のmysql.iniで文字セットに関係するところを抜き出しますと以下のようにしてました。
自分も設定方法をきちんと把握できてないのですが多分[mysqld]の方が問題なのだと思います。

[mysql]
default-character-set = utf8

[mysqld]
character-set-server = utf8

コマンドプロンプトからmysqlコマンドを起動した際の文字セットは以下のようになってますが、
utf8のカラムの内容は文字化けせずに表示されてます。

+--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | cp932 | | character_set_connection | cp932 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | cp932 | | character_set_server | utf8 |<-質問者さんとここが違う | character_set_system | utf8 | | character_sets_dir | C:\Program File\... | +--------------------------+--------------------------------+

character_set_client/_connection/_resultsはmysqlへ接続するクライアントの文字環境によって変わるものだと思います。mysqlとは別途WorkBenchから同じことをすると上記のcp932の部分がutf8と表示されてますので。

なおサーブレットコードでエンコードを指定する前にpreparedStatementを生成してますが、どちらかといえば一番最初にエンコードを指定すべきではないでしょうか?

投稿2017/01/15 02:53

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

liuchao4664

2017/02/06 01:11

遅くなって申し訳ありませんでした。まったく同じ環境で友達のパソコンでは文字化けは発生しないけど、いくら設定を変えても、日本語をうまく表示できないです。でもおかげで対応する方法を一つ覚えました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問