MySQL の文字コードについて。


基本的に UTF-8 のエンコードで利用しているサーバに EUC-JP のデータベースを作成し、データをインポートしたいのですが、EUC-JP ではなく UTF-8 でインポートされてしまいます。

どのように設定すれば EUC-JP のままデータをインポートできるでしょうか。

my.cnf:
[mysqld]
default-character-set=utf8
skip-character-set-client-handshake

mysql> status;
--------------
mysql Ver 14.12 Distrib 5.0.24a, for pc-linux-gnu (i486) using readline 5.1
Server version: 5.0.24a-Debian_9-log
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: ujis
Client characterset: ujis
Conn. characterset: ujis
mysql> show variables like "char%";
| character_set_client | ujis |
| character_set_connection | ujis |
| character_set_database | ujis |
| character_set_filesystem | binary |
| character_set_results | ujis |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |

回答の条件
  • 1人5回まで
  • 登録:2007/03/08 10:17:17
  • 終了:2007/03/08 14:04:35

回答(6件)

id:Yota No.1

Yota回答回数453ベストアンサー獲得回数282007/03/08 10:35:42

データベースを作るとき

>CREATE DATABASE hoge DEFAULT CHARACTER SET ujis ;

でどうでしょう。

指定しなければutf8でつくられるので。

id:typos24

すみません、文字数で怒られたので削ったのですが、その辺は一通り試しています。

コメントに書いておくべきでした。

mysqldump したファイルにも set names ujis を追記してインポートを試しています。

2007/03/08 10:49:36
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402007/03/08 10:54:39

character_set_database が ujis であるならば、変換されるので UTF-8 での格納は基本的には無理。

set names ujis;

これはクライアント側のコード指定なので、サーバーに格納される文字コードとは直接関係が無い。


失礼ですが、何を持って UTF-8 でインポートされていると判断したのかをお伺いしたい。

id:typos24

skip-character-set-client-handshake 設定しても変換が行なわれるということですか?

UTF-8 なサーバに EUC-JP なデータベースを作成し、EUC-JP なデータをインポートしたいんです。

なぜそう判断したかというと、GNU screen のエンコードを変更すると UTF-8 では正しく表示されますが、EUC-JP だと化けてしまうためです。

利用するWebアプリでも化けてしまっているので間違いないだろう、と。。

2007/03/08 11:03:15
id:hamster001 No.3

hamster001回答回数474ベストアンサー獲得回数142007/03/08 11:04:54

ポイント20pt

ここがくわしいです。注意点としてはコンパイル時にbinaryが指定してあること、phpmyadminは選んだ文字コードに変換して画面表示するのであてにならないこと、です。

http://vivian.reverb.jp/mysql4.1.html

id:b-wind No.4

b-wind回答回数3344ベストアンサー獲得回数4402007/03/08 11:16:20

ポイント25pt

skip-character-set-client-handshake 設定しても変換が行なわれるということですか?

これはクライアントが使用する文字コードの設定を一律にサーバーの文字コードの設定と同じにすると言う事です。

変換自体は必要に応じて行われます。


mysqldump でダンプしたファイル自体の文字コードはどうなっていますか?

id:typos24

なるほど…勉強になります。

ファイルのエンコードは問題なくEUC-JPになっています。念のためエディタで変換してみても結果は同じでした。

2007/03/08 11:26:33
id:Yota No.5

Yota回答回数453ベストアンサー獲得回数282007/03/08 11:22:20

ポイント45pt

character_set_database ujisでも

character_set_server utf8なら無意味ということですね。

それでは、ujis用のmy.cnfを作っておいてサーバーを起動するというのはどうでしょう。

$mysqld_safe --defaults-file=/etc/my_ujis.cnf &

id:typos24

そのようですね…。

ただ、これだと別のポートで起動する必要がありますよね?あくまでメインは UTF-8 なので。

2007/03/08 11:30:05
id:kurukuru-neko No.6

kurukuru-neko回答回数1844ベストアンサー獲得回数1552007/03/08 12:36:57

ポイント20pt

>skip-character-set-client-handshake

サーバ既定動作で動くだけで変換しない

わけではない。

http://dev.mysql.com/doc/refman/5.1/en/charset-connection.html

確認する場合は

SET character_set_results = NULL;

該当データをインポート元のデータベース

のテーブルの文字セットはujisですか?

show create table テーブル名

  • id:Yota
    いったんujisでmysqdを起動しておいてインポートした後、またutf8で起動しなおしたらだめですか。
  • id:Yota
    これはバージョン5.0.24aだと思いますが、そもそもMySQLってひとつのサーバプロセスで違うcharactersetを使えるのでしょうか。
    コンパイルするとき--default-character-set=binaryとして、create databaseのとき指定するべきだというオチだったりして。
  • id:b-wind
    > そもそもMySQLってひとつのサーバプロセスで違うcharactersetを使えるのでしょうか。
    MySQL5 ではデータベース毎はおろか、テーブル毎やカラム毎に別々の文字コードを使用することも可能です。

    > --default-character-set=binaryとして、create databaseのとき指定するべき
    たぶん --default-character-set=binary でコンパイルして、後は何もしないのが一番簡単(MySQL4.0 以前と同じ運用)
  • id:Yota
    >MySQL5 ではデータベース毎はおろか、テーブル毎やカラム毎に別々の文字コードを使用することも可能です。
    でも、この例のようにデータベースのキャラクタセットをujisにしてもサーバのキャラクタセットutf8に自動的に変換されてしまうのでは意味ないですよね。
  • id:b-wind
    > utf8に自動的に変換されてしまう
    どこかの設定か操作にミスがあるだけだと思いますが。

    意味が有るか無いかは使い方しだいなのでなんとも。
  • id:typos24
    >> b-wind さん
    >どこかの設定か操作にミスがあるだけだと思いますが。
    チェックすべき点を教えていただけると非常に助かります。。
  • id:kurukuru-neko
    【補足】
    mysqldumpしたファイルが

    create table ・・・・・
    DEFAULT CHARACTER SET 'utf8'

    http://dev.mysql.com/doc/refman/5.0/en/create-table.html

    となってる気がする

    'utf8'でテーブルが作成されるると当然
    ながらクライアントから何を渡しても
    最終的にujis->utf8変換で内部は'utf8'
    に変換されてしまったと推定

  • id:Yota
    上の人がリンクを示したページを見ると、
    collation_server=utf8_unicode_ci
    character_set_server=utf8

    You can also add
    skip-character-set-client-handshake
    to enforce using of utf8 encoding in db.
    と書いてありますね。
    クライアントもutf8とみなされちゃってるのかも。

    とっちゃったほうがいいのではないですか、これ。
    skip-character-set-client-handshake

  • id:typos24
    >> kurukuru-neko さん
    そこは何度も確認したので無いですねぇ。

    >> Yota さん
    弊害が怖いですが、ちょっと試してみます。案外うまくいきそうな気が。。

    低レベルな質問にみなさんありがとうございました。
    後は自分でなんとかしたいと思います。
  • id:kurukuru-neko
    UJISサーバーのUJIS DBをEXPORT
    UTF8サーバーのUJIS DBへIMPORT

    1. インポートするファイルに
    /*!40101 SET NAMES ujis */;
    のような記述がある場合
    mysqldumpに --skip-set-charset
    を指定して自動生成しないようにする。

    2.mysqldumpするサーバーの[mysqld]に
    skip-character-set-client-handshake
    指定があると
    mysqldumpに--default-character-setを
    指定していも指定は無視される。
    skip-character-set-client-handshake
    やめる。

    3.ダンプファイルの最初のテーブル生成
    前に
    set names ujis;
    set character_set_database=ujis;
    set character_set_server=ujis;
    set character_set_results=NULL;
    status;
    show variables like "char%";
    も入れる。(データは全てUJIS)

    4.ダンプされたファイルの
    各create tableのDEFAULT CHARSETがujis
    か確認する。

    =====================================
    my.cnf修正
    mysqldumpをするサーバーの
    skip-character-set-client-handshake
    は削除

    Exportダンプ
    mysqldump -uroot --default-character-set=binary --skip-set-charset ujisDB名 >dump.sql
    or
    mysqldump -uroot --default-character-set=ujis --skip-set-charset ujisDB名 >dump.sql

    サーバーUTF8 Import(UJIS)
    3.の修正をして
    mysql importdb <dump.sql

    or
    mysql importdb
    set names ujis;
    set character_set_database=ujis;
    set character_set_server=ujis;
    set character_set_results=NULL;
    status;
    show variables like "char%";
    source dump.sql;
  • id:typos24
    >> kurukuru-neko さん
    詳細にありがとうございます!ポイントあげれなくて申し訳ないです。。
    別に mysqld 用意してとりあえず逃げておいたのですが、明日にも検証してみたいと思います。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません