MySQL 5.0にCSEで接続する方法
MySQLのGUIクライアントはほとんどの人が「phpmyadmin」か「MySQL Query Browser」を使っていると思うんだけど、phpmyadminはWebアプリなので色々とダルイ事が多いし、MySQL Query Browserは日本語の表示は出来ても入力が出来なくて困る、と言うどちらもイマイチで結構ストレスになる事が多かった。
んで、今日ちょっと調べていたらCSEからMySQL 5.0に繋ぐ方法が分かったので手順をメモ。
日本語もちゃんと表示・入力できた。
CSEから直接MySQL 5.0につなごうとすると例外吐いて落ちるんだけど、ODBCを経由すると接続できる。
以下、手順。
MySQL Connector/ODBCのダウンロード・インストール
http://dev.mysql.com/downloads/connector/odbc/3.51.html
からダウンロードしてインストール。
自分はMSI Installerにした。
ODBCの設定
- ファイル名を指定して実行より「odbcad32.exe」を開く。
- ユーザDSNタブから「追加」ボタンをクリックする。
- データソース一覧が表示される。データソースに「MySQL ODBC 3.51Driver」を選択し、完了をクリック。
- 今度は設定値を入力するダイアログが開くので、Loginタブに必須となる情報を入力。Data Source Nameはデータソース一覧から選択するときに表示される。
- Advancedタブのさらにその下、Flag3タブの「Read Options From my.cnf」にチェックを入れる。
- 後その他のオプションはよく分からないのでデフォルトのまま。OKをクリックして終わる。
これでデータソースの作成は完了。
自分メモ
自分の環境ではMySQLの設定はサーバ・クライアント共にUTF-8。勿論DBもUTF-8
で、CSEから
show variables like 'char%';
すると以下のような結果になる。
Variable_name | Value |
character_set_client | sjis |
character_set_connection | sjis |
character_set_database | utf8 |
character_set_filesystem | binary |
character_set_results | sjis |
character_set_server | utf8 |
character_set_system | utf8 |
character_sets_dir | C:\dev\mysql5.0\share\charsets\ |
注意書き
(注1)
cnfという拡張子はWindowsだとNetMeeting用か何かに関連付けられていて、my.cnfでファイルを作成するといきなりアイコンが変わってビックリする。でもファイルの中身自体が変わるわけではないので、テキストで開いて編集すればたぶん大丈夫。
自分は我慢ならなかったのでregsvr32 -u msconf.dllとして強制的に排除した。
他に影響があるかどうか不明だけど、参考URLに挙げたサイトで削除OKと出ているのでたぶん問題ないと思われる。まぁ自己責任で。
(注2)
初めはmy.cnfでデフォルト文字コードにUTF-8を指定していたのだけれど、CSE側がSJISらしく文字化けしてしまった。
たぶんODBCコネクタがSJIS <-> UTF-8変換をよしなにしてくれてるんだと思う。
update_atやcreated_atカラムの自動更新を無効にする方法
created_atやupdated_atは便利なカラムではあるが、データ移行にARを使う時にただデータを移したいだけなのに勝手にデータを更新してしまってちょいありがた迷惑な感じに。
ググってもやり方が出てこなかったのでARのソースをGrepする。
それっぽい箇所がtimestamp.rbにあった。
record_timestampsっていうクラス変数をfalseにすれば自動更新が無効になる。
base.cattr_accessor :record_timestamps, :instance_writer => false base.record_timestamps = true #(中略) def create_with_timestamps #:nodoc: if record_timestamps t = self.class.default_timezone == :utc ? Time.now.utc : Time.now write_attribute('created_at', t) if respond_to?(:created_at) && created_at.nil? write_attribute('created_on', t) if respond_to?(:created_on) && created_on.nil? write_attribute('updated_at', t) if respond_to?(:updated_at) write_attribute('updated_on', t) if respond_to?(:updated_on) end create_without_timestamps end def update_with_timestamps #:nodoc: if record_timestamps t = self.class.default_timezone == :utc ? Time.now.utc : Time.now write_attribute('updated_at', t) if respond_to?(:updated_at) write_attribute('updated_on', t) if respond_to?(:updated_on) end update_without_timestamps end
2008/2/13 追記
クラス変数はサブクラスでも共通 - Lazy Technologyは抑えておかないと思わぬところでハマるので注意。
2008/3/25 追記
update_without_timestampsメソッドを使うと、その時だけupdated_atやcreated_atの更新を無効に出来る。