2007年4月 1日

【PHP×PEAR】DB_DataObjectの文字化け

DB_DataObjectでMySQLに接続して使う場合、どうやって
SET NAMES ujis;
を書けばよいのか迷っていた。そしたら、マニュアルが日本語で公開されていたので、それどおりやるとうまく行った。


$person = new DataObjects_Person;
$person->query("SET NAMES ujis");
$person->query("SELECT * FROM {$person->__table} WHERE id > 12 ORDER BY id");
while ($person->fetch()) {
echo $person->name;
}
?>


2007年3月21日

手軽なSQLite

MySQLをバックアップ&リストアしようと思うとそこそこ面倒くさい。mysqldumpを使って、それから障害直前のリカバリまでしようとしようものなら、不慣れで頭がいたい。いやいや、そこまでしなくてもAccessのように使えるだけでいいんだけど。。。というケースもある。そういう時はこのSQLiteがいいじゃないでしょうか。(使ったことはないけれど)

10万件までならMySQLと遜色ないパフォーマンスを発揮することができるようです。

その特徴は。。

1.1ファイル1データベース
 バックアップ&リストアはコピー&ペースト。
2.ユーザを持たない
 誰でも閲覧可能なデータとかにいいのでは。ファイルへのアクセス権限をOSレベルで制限する。
3.データ型を持たない
 まぁ、INTとかVARCHARとか気にしなくてもいいようです。ただし、INT型を主キーにする場合は、明示的に宣言する必要があるようです。その場合は、オートナンバーとみなされるようです。

手軽なSQLiteの続きを読む

2007年3月20日

【MySQL×PHP】文字化け

文字化けの問題は終わらない。character-setをサーバ、クライアント,DBであわせるということは以前にもメモしたが、それだけじゃない。面倒くさい。文字化けの深刻さは、SQL文が文字化けするので、ちゃんとした結果が返ってこない。一見なんのエラーだか、さっぱりわからない。

今回は少し進展した。
phpのスクリプトに
SET NAMES cp932;
という文でうまくいくと以前メモしたが、どうもうまく行かない場合もある。
そんなときは、ujisで対応したらどうだろうか。
SET NAMES ujis;

また、my.ini(MySQLの設定ファイル(my.cnf))の[mysqld]の部分に下記を追加すると自動変換機能がオフになる。これで、文字化け問題を回避できる場合もある。
my.ini
[mysqld]
skip-character-set-client-handshake

さらにMyNAパッチを当てたlibmysqlclientおよびlibmysql.dllを入れ替える。
パッチのダウンロード
C:\php5\とかC:\WINDOWS\SYSTEM32\にコピーすればよい。

phpスクリプト側でmy.iniを読み込むようなコーディングも必要らしい。

PHP version 4 の場合
読めない。[client] に書いても無駄。
http://www.mysql.gr.jp/frame/modules/bwiki/?Contrib のパッチを当てる。

PHP version 5の場合
mysqli モジュールに、my.cnf を読む関数が用意されている。

mysqli_options(connection, MYSQLI_READ_DEFAULT_FILE, "/etc/my.cnf");
mysqli_options(connection, MYSQLI_READ_DEFAULT_GROUP, "php");

mysql コマンドでは大丈夫なのに、PHP,perl,accessなどで文字が ? に化けるのは?(文字化け) †

良くある勘違いは、
「mysqlコマンドが動いているから、自分のアプリも正しくコード変換するだろう」
というものです。
これは間違いです。

次の節の概念図をじっくり見てください。

MySQL サーバーとおしゃべりしている libmysqlclient.so (libmysql.dll) に、キャラクターセットが埋め込まれています。

mysql コマンドには default-character-set のオプションがあり、キャラクターセットの指定ができます。
これは libmysqlclient.so (libmysql.dll) の埋込キャラクターセットを上書きします。

しかし、MySQL AB が提供しているコマンド(mysqldump, mysql, mysqlimport等)や MyODBC 以外の、
別の誰かが作ったアプリやコマンドは、
my.cnf を読んだり、default-character-set オプションがあったりするわけではありません。
my.cnf を読んだり、default-character-set オプションが使えたり、SET NAMES 文が実行されたりするのは、
あくまでも、アプリ側の責任、作り手の責任なのです。
上の図で言えば、PHPMyAdmin や PHP 自身の部分に、キャラクターセットの指定をする処理や my.cnf を読む処理を、作り手が意図して書かない限り、実現しないのです。

これは perl だろうが Ruby だろうが、access だろうが、PHP と同じです。
(MyODBC(Connector/ODBC)は設定をすることで、my.cnf の [odbc] グループを読みます。
access で MyODBC を使用しているなら、my.cnf を読むオプションを有効にしておきます。)


コードを書くのが嫌なら(変更することが出来ない状況なら)、libmysqlclient (libmysql,dll) の埋込キャラクターセットを変えるのです。
これは libmysqlclient(libmysql.dll)のコンパイルのし直しを意味します。
なお、5.0.13-rc 以上では、mysqld --skip-character-set-client-handshake とすることで、libmysqlclient はサーバーのキャラクターセットに合せるようになります。
1 つのサーバーで 1 つのキャラクターセットしか使用しない(4.0までのように)のであれば、skip-character-set-client-handshake オプションの指定だけで OK です。
このとき、libmysqlclient の re-compile は不要です。

2007年3月 3日

【MySQL】システムで予約されているエラー(-7776)

システムで予約されているエラー(-7776)です。このエラーに対するメッセージはありません。

ODBCでMySQLにリンクした後に、Accessから更新しようとすると上記のエラーがでる。ODBCの問題なのか、日本語の問題なのか、はたまた、MySQLの問題なのか。MySQLとAccessとの連携の道のりは険しい。

今回は先にLOAD DATA INFILEコマンドで1万4千件のレコードをインポートしてから行った。試しに、空のデータベースに対して同じように検証した場合、上記のエラーは出ず、今のところ問題はない。

2007年3月 2日

MySQLとAccess連携

MySQLとAccess連携でメリットは下記のように考えている。(もっとあると思うけど。)
・高機能データベースをAccessのフォームインターフェイスを作って操作できるというメリットは大きい。
・開発もphpよりは簡単だし、ユーザは使い慣れている。
・Accessを複数人(経験では8人)でネットワーク上で使用すると、よくAccessデータベース自体が破損してしまう。(使用頻度-高、レコード件数-約1万5千件/年、ファイルサイズ11MB)

AccessからMySQLを操作する場合下記のことに注意しなければならない。

MySQLとAccess連携の続きを読む

【MySQL】データのインポート

MySQLで他のファイル(csvファイルとか)からインポートする場合、下記の4つのパターンがある。(もっとあるかも知れないが。。)

1.ACCESSのODBCを使う。
2.MYSQLクライアント(コマンドプロンプトで)LOAD DATA (LOCAL) INFILEコマンドを使う。
3.MYSQLIMPORTを使う。
4.ファイルに記述されたINSERT構文を実行する

mysqlimportは、文字コードの指定が効かないなど、あんまりいい思いをしていないので、LOAD DATA INFILEでの成功設定事例を掲載する。

【MySQL】データのインポートの続きを読む

2007年3月 1日

PHP文字化け問題

以前にもとりあつかっているが、PHPの文字化け問題だが、MySQLの文字化けを解決した後は、PHPを使ってブラウザに表示する時にも文字化けする。やっかいだ。サーバ、データベースの設定がしっかりしていてもだめなのだ。そんな時は、PHPスクリプトに明示的に記述してやるとうまく行くことがある。

PHP文字化け問題の続きを読む

XAMPPを設定する

XAMPPは各種設定ファイルがどこにあるのかわかりにくい。最近その索引を見つけた。これがないとねぇ。ちなみに日本語の最新版はXAMPP 1.6.0a 。PEARも標準でインストールされている。(パッケージのインストールはされていないが)

最新版の特徴:

* Apache 2.2.4
* MySQL 5.0.33
* PHP 5.2.1 & PHP 4.4.5
* phpMyAdmin 2.9.2
* FileZilla FTP Server 0.9.22
* OpenSSL 0.9.8d


参考

XAMPPを設定するの続きを読む

2007年1月24日

MySQLとACCESSと文字コード

ACCESSのデータをMySQLでいきなり使おうと思っても文字化けしてしまうことが多い。やはり設定が必要なのだ。Windowsの日本語の文字コードといばShift-JISなんだが、正式にはWindows-31Jと呼ばれていて、若干違うところがあるらしい。このWindows-31Jと互換性があるように作られたのがMySQLのcp932と呼ばれる文字コードなのだ。

MySQLとACCESSと文字コードの続きを読む

2007年1月18日

ERROR 1406 Data too long for Column [MySQL]

ACCESSのデータを1400件まではODBC経由でエクスポートできた。ただ、それ以降は、またオーバーフローか、ERROR1406だ。いろいろ試したんだが、結局このエラーメッセージで止まってしまう。やっぱり日本語の文字セットの問題かなとネットを徘徊して疑いだした。

文字セットの設定を設定ファイルで行っているにも関わらず、このメッセージが出てきていたので、よもや文字セットの問題と気づくまでに時間を要した。

今回の成功例では、
LOAD DATA INFILEコマンドを使う前に
mysql> set names sjis;
Query OK, 0 rows affected (0.00 sec)

をタイプする。

事前に同じテーブルの構造だけ、インポートさせておくか、作成しておいたほうがよい。
ただし、インポートしたデータは完全なものではない。ほぼ完全ではあるけれど。。

サーバーの文字セット状況を確認するには、
mysql> status
とタイプすればよい。

2007年1月12日

LOAD DATA INFILE不発

ACCESSのデータをMySQLに取り込む作業を行っているんだが、そのデータの件数はカラム(フィールド)が40個に対して1万2千レコードに及ぶ。これはもう手動では不可能な件数だ。やはり自動でデータを流し込みたいのだが、ODBC経由のACCESSからエクスポートをすると「オーバーフロー」というエラーがでてうまくいかないし、LOAD DATA INFILEコマンドを使っても「Data too long for column」というエラーがでてうまく行かない。エラーメッセージの意味を直訳すると、ひとつのカラムに対してデータが長すぎるという意味なんだが、意味が不明である。レコードを分割して、ODBC経由のACCESSからエクスポートをすると成功した。薗件数は1400レコード。8回は同様の作業が必要になりそうだが、たった8回でうまく行くのならまぁ、よしとするか。

実際は、ODBC経由でエクスポートしたテーブルにLOAD~を使ってインポートする。

2007年1月11日

カラム名は英数字

ACCESSのデータのカラム名(フィールド名)はだいたい日本語だ。MySQLにデータを移行する場合、データそのものが日本語の場合は、ほとんど問題ないのだが、フィールド名は大問題だ。ODBC経由でACCESSのみで使用するだけなら、あまり問題にならないのだが、PHPを用いてブラウザ経由で表示するような場合は、支障をきたす。英数字に変換する方法をとるのが手っ取り早い解決策ではないだろうか。

ACCESSのリンクテーブルからデータが更新できない

MS ACCESSからのデータをMySQLに移行する作業を行っている。ODBC経由でエクスポートするのが楽なんだが、主キーの設定が無効になってしまうので、MySQLから主キーの設定をする必要がある。文字コードはsjisなので、あとでPHPから接続しようと思うと文字化けの原因にもなったりするので、その設定にも留意が必要である。

何も考えずに、ACCESSのデータをMySQLにインポートしてODBC経由でACCESSから接続して、データの更新をしようと思うとなぜかうまくいかない。問題は、主キーを設定していないためだ。主キーを設定してから再度リンクテーブルを設定しなおすとうまく行く。

ACCESSのリンクテーブルからデータが更新できないの続きを読む

2006年12月22日

テキストデータをMySQLにインポート

ACCESSでデータの故障を3ヶ月で2回も経験したので、そろそろ本格派データベースへの移行を考えなくてはいけない。その前に、例えばバックアップをスケジュール化して自動にするという方法もある。

テキストファイルのMYSQLへのインポートの方法を3つ調べることができた。

1.ACCESSのODBCを使う。
2.MYSQLクライアント(コマンドプロンプトで)LOAD DATA (LOCAL) INFILEコマンドを使う。
3.MYSQLIMPORTを使う。

テキストデータをMySQLにインポートの続きを読む

2006年10月31日

XAMPPでMySQLにコマンドライン

XAMPPをインストールするとコマンドラインでMySQLにアクセスしたい時に戸惑う。そんな時は、mysql.exeがどこにあるか探して、

mysql -u [root] -p

とタイプする。

例)

>cd C:\Program Files\xampp\mysql\bin

C:\Program Files\xampp\mysql\bin>mysql -u root -p

Enter password:

XAMPPでMySQLにコマンドラインの続きを読む

2006年9月26日

XAMPP for Windows

これまでアパッチやMySQL,PHPのインストールを何度もトライした。ボチボチ慣れてきた頃に、これらの設定を一括できるソフトを発見してしまった。アパッチ2.2で失敗したことが馬鹿らしくなるくらい簡単にアパッチ、PHP、MYSQLがインストールできてしまった。しかも、PHPMyAdminもビルトイン。これは便利だ。しかし、それぞれが持つ個別のツールが使えなかったりして、以外に不便だったりして。とにかく今すぐPHPのスクリプトを書きたいとか、WEBサーバーを立てたいという人には無茶苦茶便利なツールだ。

個人的にはコマンドラインでMYSQLにアクセスしづらくなっているので、ちょっと不便。なれるまでに時間がかかりそうだ。

ダウンロードはこちら

XAMPP for Windowsの続きを読む

2006年9月25日

MS Accessだと文字化けする

MS AccessでMySQLに接続できるようになれば、かなり便利だ。MS Accessを複数人で利用する場合、5,6人が限界らしく、ファイル自体が壊れてしまうケースも報告されている。そこで本格派データベースが必要なわけだ。それがMySQLなんだけど、まぁマイクロソフト製品ほど導入が簡単ではないため今後も勉強が必要そうだ。

さて、MySQLにMS Accessで接続できるのは便利だが、やはりそれなりの制限もある。さらなる研究が必要だが、現在把握しているもので代表的なものが文字化けだ。

MS Accessだと文字化けするの続きを読む

2006年9月23日

Apache2.2 × PHP5.16 インストール

MySQLを操作するGUIツールで一番有名なのはPhpMyAdminだ。今のところWEB連携DBを作る予定はないが、phpMyAdminは使ってみたいので、アパッチとphpをWindows2000SP4にインストールしたのだが、そこには思わぬ伏兵が潜んでいた。というかまだ解決してないけど。

Apache2.2 × PHP5.16 インストールの続きを読む

MySQL5.0 × MS Access

MySQLは世界的に広く利用されているデータベースで動作が軽快なことで知られている。Windows上でも動作確認がされていてUNIX/Linuxに不慣れな人にも扱いやすい。

マイクロソフトアクセスで接続できるようになると、アパッチとPHPをインストールして、PHPでプログラミングでWEB連携しなくて済むのでかなり期待している。

MySQL5.0 × MS Accessの続きを読む