mysql:9694
From: "HIROSE, Masaaki" <"HIROSE, Masaaki" <hirose31@xxxxxxxxxx>>
Date: Tue, 22 Jun 2004 00:36:44 +0900
Subject: [mysql 09694] db.optについて
ひろせといいます MySQL 4.1.1 から database の文字コードの情報を保存しておくために、 db.opt というファイルが作られるようになりました。このファイルは CREATE DATABASE や ALTER DATABASE を実行したときに DATADIR/DBNAME/db.opt に作られ、テキスト形式で中身は default-character-set=sjis default-collation=sjis_japanese_ci のようになっています。 この db.opt に関係して、トラブりそうな場面が出てくるような気がするので すがどうなんでしょうか? というメールです。 # なんかトリビアの種みたいなメールだ… まず 4.1.2 での挙動を列挙します。 # ざっくり find -type f -print0 | xargs -0 egrep '(db\.opt|MY_DB_OPT_FILE)' # で見た感じでは、さっきclone した bk 版と、4.1.2 とでは違いはないよう # でした。 1 CREATE DATABASE を実行したときに db.opt が作られる。 2 CREATE DATABASE で CHARACTER SET を指定した場合はその文字コードが保 存される。 3 CREATE DATABASE で CHARACTER SET を省略した場合は character_set_server の文字コードが保存される。 4 ALTER DATABASE を実行したときに db.opt が作られ、指定した文字コード が保存される。 5 SHOW CREATE DATABASE が出力する DEFAULT CHARACTER SET 句には、db.opt があればそれを、なければ character_set_server の文字コードが表示され る。 6 database、test と mysql を作る mysql_install_db は CREATE DATABASE を 使用していないので、db.opt は作られない。 7 MySQL 4.0 以前の環境から丸ごとコピー、もしくは、mysqld を 4.1 にバー ジョンアップした場合は、これらの database には db.opt は存在しない。 8 mysqldump は CREATE DATABASE 文に DEFAULT CHARACTER SET 句を付加しな い。(--compatible が指定されていなければ、CREATE TABLE の DEFAULT CHARSET は付加される) 従って、レストア時には元の database に db.opt があってもそれとは関係 なく、レストア時の character_set_server が database の文字コードとし て db.opt に保存される。 9 db.opt がない database で、DEFAULT CHARSET を省略した CREATE TABLE で 作った table の文字コードは、character_set_database の文字コードにな る。 続いて (こじつけっぽのもありますが) 考えられるトラブルの具体例です。他 にもあればフォローお願いします。 # 変数 character_set_* の制御方法は # [mysql:9586] http://www.mysql.gr.jp/mysqlml/mysql/msg/9586 # を参照ください。 A sjis の database を mysqldump でダンプして、mysqld --default-character-set=utf8 なサーバーにレストアした。database の文 字コードが sjis になっているつもりで、文字コード指定を省略して CREATE TABLE したら table の文字コードが sjis ではなく、utf8 になっ てしまった。[8] → 無用なトラブルを回避するために、4.1 での CREATE TABLE には DEFAULT CHARSET をつけるようにした方がいい? B database mysql と test には db.opt がないので、これらの database で DEFAULT CHARSET なしで CREATE TABLE した場合の table の文字コードは 変数 character_set_database の値によって恣意的に決定されてしまう。 [6,9] → character_set_database を変えたりしない、mysql の table に入れるデー タは専ら us-ascii だけ、test はあくまでテスト用の database である、 という理由で、実際に問題になる局面は少ないかも? C db.opt がない database で DEFAULT CHARSET を省略した CREATE TABLE で 作った table の文字コードは、SHOW CREATE DATABASE で表示される database の文字コードと異なる場合がある。[5,9] → 無用なトラブルを回避するために、4.1 での CREATE TABLE には DEFAULT CHARSET をつけるようにした方がいい? 結局、 db.opt がある/ないに関わらず、database の文字コードには依存しないよう に、CREATE TABLE には DEFAULT CHARSET をつけるようにする、というのが安 全ということでしょうかね。 ではでは -- ひろせ http://www.irori.org/
-> 9694 2004-06-22 00:36 ["HIROSE, Masaaki" <h] db.optについて 9696 2004-06-22 10:32 ┗[<takeshi@xxxxxxxxxx>] 9697 2004-06-22 12:16 ┣["HIROSE, Masaaki" <h] 9701 2004-06-23 10:17 ┃┗[<takeshi@xxxxxxxxxx>] 9698 2004-06-22 13:58 ┗[Hirofumi Fujiwara <f]