@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

MySQLで文字化けしています。

1
投稿者投稿内容
ゆきお
常連さん
会議室デビュー日: 2003/12/17
投稿数: 22
お住まい・勤務地: 名古屋市
投稿日時: 2006-08-19 08:59
こんにちは。ゆきおといいます。

ASP.NET(C#)を使用して、webアプリを構築しています。

既存で稼動しているデータベース(MySQL)よりデータを取得して表示させるページを作成しています。表示結果は全角文字が文字化けしてしまいました。

【環境】
OS:WindowsXP Professional sp2
DB:MySQL 3.23.58
言語:Visual C#.NET + .Net Framework v1.1
接続プロバイダ:MySQL@Connector/Net 1.0.7

文字コードについてはアプリケーションはシフトJISで、MySQLは日本語EUCです。
接続プロバイダはシフトJISで指定して接続しています。
以下に環境を記します。

【文字コード】
[ASP.net]:shift-jis
web.configで設定
<globalization requestEncoding="shift_jis" responseEncoding="shift_jis" />

[MySQL]:日本語EUC
設定値 ujis

【接続プロバイダのソース】
con.ConnectionString = String.Format("Server={0};User Id={1};Password={2};Database={3};Charset={4};Pooling={5};","xxx.xxx.xxx.xxx","User1","Password1","DB_NAME","sjis",true);

【問題箇所】
取得したデータをDataGridに表示したいのですが、文字化けします。

【質問箇所】
文字化けしないようにしたいのですが、何か良い解決方法があれば教えていただきたいと考えています。

なお前提条件として
1.MySQLデータベースは稼動中システムで使用しているため文字コードは変更不可
2.他の箇所は(web.config等)変更可です。

以上教えていただけるとありがたいです。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-08-19 13:05
eucで取りに行くんだから接続文字列のcharsetにはeucを指定するんじゃないですか?
ゆきお
常連さん
会議室デビュー日: 2003/12/17
投稿数: 22
お住まい・勤務地: 名古屋市
投稿日時: 2006-08-19 14:01
べるさん返答ありがとうございます。

接続プロバイダで『ujis』を指定したのですが、fill実行時にアプリケーションエラーが発生したので『sijs』を指定しています。

【エラーメッセージ】
※アプリケーションエラー・ページにて
Character set 'ujis' is not supported

【プロバイダ:コネクション】
con.ConnectionString = Strin.Format("Server={0};User Id={1};Password={2};Database={3};Charset={4};Pooling={5};","xxx.xxx.xxx.xxx","User1","Password1","DB_NAME","ujis",true);

【接続】
MySqlDataAdapter mySqlda = new MySqlDataAdapter("SELECT * FROM table", this.Con);
mySqlda.Fill(ds);

fill実行時にエラーが発生

>eucで取りに行くんだから接続文字列のcharsetにはeucを指定するんじゃないですか?

私もそう思いましたが、コネクション文字列での'ujis'指定ではfill実行時にアプリケーションエラーとなってしまいます。
Charasetの指定文字の形式(日本語EUCの場合:ujis)が悪いのか不明です。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-08-20 07:04
※私、MySQL@Connector/Net 1.0.7 をそれほど理解してるわけではありません。

引用:
接続プロバイダで『ujis』を指定したのですが、fill実行時にアプリケーションエラーが発生したので『sijs』を指定しています。

mysqlにはバイト列が保存されていてそれがeuc-jpなのですからsjisとして取りにいっても
当然文字化けします。.NET側でエンコードしなおせば別ですが。

引用:
Character set 'ujis' is not supported

これ、最初はうちでも出ました。

で、MySQL@Connectorのインストールフォルダにソース(src)がありますよね(プロジェクトになっている)
これにCharSetMapってクラスがあるんですけど、怪しげにコメントアウトされている箇所があって
ujisのマッピングが外されています。

mapping.Add("ujis", "EUC-JP");

を加えてビルドしてできたdllを使用したら正常に動きましたよ。

※コメントアウトでは「EUC_JP」になってましたがこれではだめでした。
ゆきお
常連さん
会議室デビュー日: 2003/12/17
投稿数: 22
お住まい・勤務地: 名古屋市
投稿日時: 2006-08-21 07:10
べるさん返答どうもです。

引用:
MySQL@Connectorのインストールフォルダにソース(src)がありますよね(プロジェクトになっている) これにCharSetMapってクラスがあるんですけど、怪しげにコメントアウトされている箇所があって ujisのマッピングが外されています。

mapping.Add("ujis", "EUC-JP");

を加えてビルドしてできたdllを使用したら正常に動きましたよ。



接続プロバイダ「MySQL@Connector/Net 1.0.7」で『ujis』が指定できない理由はこれのような気がします。今日ですが開発環境で確認してみます。

結果はどのようになったか報告します。もう暫くお待ちください。m(__)m
ゆきお
常連さん
会議室デビュー日: 2003/12/17
投稿数: 22
お住まい・勤務地: 名古屋市
投稿日時: 2006-08-22 06:29
返答が遅れましたが、結果報告です。

MySQLコネクタの以下のコードを修正し、コンパイルしてdllを作成しました。

【修正】
CharSetMap.cs

 mapping.Add("ujis", "EUC-JP"); を追加

上記dllを使用して、プログラムを実行したら全角文字の文字化けが解消されました。

べるさん大変助かりました。CharSetMap.csを修正するのは全く気づきませんでした。

引用:
※コメントアウトでは「EUC_JP」になってましたがこれではだめでした。



※ 「EUC-JP」の指摘も素晴らしいです。

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

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