- PR -

DBに入ってるUTF-8を表示させたいが、文字化けをする。

1
投稿者投稿内容
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2006-08-16 18:20
msoです。

環境:
WindowsXP SP2
TOMCAT5.0.28
Java 1.4
MySQL 4.1


お世話になります。

JSPの業務で、文字コードと思しきところで解決が難しいところに
ぶつかってしまいました。
何か解決策等、アドバイスをいただけたらと思い書き込みをしています。

まず、現象なのですがTOMCAT、Java、MySQL等については
無事インストールが出来ています。
次にMySQLへのCreate DatabaseとTOMCATと
設定を行いJSPでのテストプログラムを作成いたしました。
※1:MySQLのCreate Database
※2:JSPのソース

当初は何も問題が無かったと思っていたのですが、
テストをしていくうちに日本語が正しく表示されない
ことに気がつきました。
ただ、自分が理解できないのは
 MySQL側 データはUTF-8
 JSP側  すべてUTF-8で統一
としているのになぜ文字化けをするのでしょうか?

また、解決方法がはっきりとわかりません。
どのようにすれば良いのでしょうか?

大変申し訳ありませんが、アドバイスをお願いします。



MySQLのCreateDatabase文とデータの作りこみ
コード:
※1
create database utf_test default character set utf8;
grant select on *.* to db_user identified by 'abcde';
flush privileges;

use utf_test

create table tbl_test (
  id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL
);
source D:\project\JRA\jra-present\db\sql\create_table.sql
#                    ↑文字コードをUTF-8に変換してある




JSPソース
コード:
※2
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@page contentType="text/html;charset=UTF-8" %> 
<%
	//パラメータを取得する
	request.setCharacterEncoding("Windows-31J");
	String strParam = request.getParameter("id");
	if (strParam == null ) {
		strParam = "";
	}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<HTML>
<head>
<title>test</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<BODY>
<div align="center">

<form method="post" action="index.jsp">
TEST:<input type="text" name="id" value="<%= strParam %>"/><input type="submit" value="検索" />
<br />
<br />
<br />

<%

	//パラメータの変数を作成
	PreparedStatement pstmt = null;
	Connection db = null;
	ResultSet rs = null;

	try {

		//JDBCの変数作成
		Class.forName("org.gjt.mm.mysql.Driver");
		db=DriverManager.getConnection("jdbc:mysql://localhost/utf_test?user=db_user&password=abcde&useUnicode=true&characterEncoding=UTF-8");
		db.setReadOnly(true);

		//select文作成
		String sql_str = "SELECT * FROM tbl_test where id = ?";
		pstmt = db.prepareStatement(sql_str);

		// パラメータを設定
		pstmt.setString(1, strParam);

		// select文を実行
		rs = pstmt.executeQuery();

		//ループを開始する
		while(rs.next()){

			//お名前
			String strName = rs.getString("name");


%>
	<table border="1" cellspacing="0">
		<tr>
			<td>ナマエ</td>
			<td><%=strName%></td>
		</tr>
	</table>
<%
		}

	} finally {
		//閉じる
		rs.close();
		db.close();
	}
%>
</form>
</div>
</BODY>
</HTML> 


mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2006-08-16 19:31
プログラムではなく、DBの設定を確認したところ
文字コードがラテンになっていたため、
文字化けをしていると判断しました。

そこで、my.iniを修正し、
コード:
mysql> \s
--------------
D:\java\mysql\bin\mysql.exe  Ver 14.7 Distrib 4.1.21, for Win32 (ia32)
Connection id:          1
Current database:       utf_test
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         4.1.21-community-nt
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:               3306
Uptime:                 5 min 52 sec


に変更をしました。

ただ、このときにinsertで日本語をインサートしようとすると
失敗します。
DB EXPERTに行くのが筋であるのは、
わかるのですがこのままここで継続的に質問を
させてください。

よろしくお願いします。

かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-08-17 00:58
最近MySQLを使い始めたのでそんなに詳しくないですが、
私はPHPでUTF-8を使用するために、
コネクション取得後に、SET NAMES utf8を実行しています。

それと、select * from information_schema.TABLESでテーブルの文字コードがわかります。
テーブルの文字コードだけラテンになってませんか?
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2006-08-17 10:36
msoです。


かつのりさん、コメントありがとうございます。

>それと、select * from information_schema.TABLESでテーブルの文字コードがわかります。
>テーブルの文字コードだけラテンになってませんか?

ですが、実行したところエラーになりました。
どうしたらいいのでしょうか?


えっと、あとmy.iniを
default-character-set=utf8
に変更して、MySQLを再起動したら、文字化けと思っていたことが
なおりました。

どうも、かつのりさんのご指摘どおりラテンで登録をしていたようです。

ありがとうございました。


1

スキルアップ/キャリアアップ(JOB@IT)