Tags : MySQL

このTagsの登録数:4件 表示 : 1 - 4 / 4

不調

post : 2006-03-10 2:16 , mod : 2006-04-09 0:06 | ,

おそらく Security Update 2006-001 を当ててからだと思うけど、PHPの調子が悪い。MySQLに繋ごうとするとこけてしまう。以下はApacheのクラッシュログ。原因は戦国無双2の合間に調査中。

Exception:  EXC_BAD_ACCESS (0x0001)
Codes:      KERN_INVALID_ADDRESS (0x0001) at 0x012fd6dc

Thread 0 Crashed:
0 libmysqlclient.15.dylib 0x00205c94 mysql_server_init + 68 (icplusplus.c:28)
1 libmysqlclient.15.dylib 0x00227d24 mysql_init + 44 (icplusplus.c:28)
2 libphp5.so 0x038fcb54 zif_mysqli_connect + 332 (mysqli_nonapi.c:72)
...


追記:
MySQLのリビルド、PHPのリビルドをしてみたが上手く行かず再起動してみる。すると正常に戻った。


考えられる原因。
・再起動すれば直る不具合が発生していた
・Security Updateでlibphp4.soが置き換えられることが分かっていたので、退避させアップデート後に戻した。この入れ替え後に再起動していなかったので不具合が発生した
・リビルド+再起動すれば直る不具合が発生していた
のどれかだと思われる。


追記:
Mac OS X 10.4.6 アップデートでまた同じ現象。libphp4.soを退避させておいたが、これを戻さないまま再起動したため同じ問題が発生。自家製ビルドに戻した後、apachectl gracefulではなく、stop → startとすれば、OSの再起動は不要でした。自家製ビルドのlibphp4.soはlibphp5.soと同居させるためにtypeを変更しているのと、MySQLのライブラリ関係で、デリケートになっているのだと思われます。

SQL 逆引きパターンマッチ

post : 2006-02-04 13:57 | , ,

データベースの中にパターンマッチ用の文字列を入れておいて、任意の文字列がそのパターンにマッチするかどうかを調べることは可能だろうか。うまい検索語が思い浮かばず、そういうことが記されたwebサイトを見つけることができなかったけれど、実際に試してみた。式の左辺と右辺を入れ替えるという単純な方法だ。

まずはMySQLで試す。以下のようなTABLEを作る。

CREATE TABLE `test` (`name` varchar(32)) TYPE=MyISAM;
INSERT INTO `test` (`name`) VALUES ('%demo%'),('^a'),('abc|cde'),('____');

そしてクエリを投げてみる。

SQL文: SELECT * FROM `test` WHERE 'search_demo_string' LIKE `name`;
結果: %demo%

SQL文: SELECT * FROM `test` WHERE '1234' LIKE `name`;
結果: ____

SQL文: SELECT * FROM `test` WHERE 'abc' REGEXP `name`;
結果: ^a, abc|cde

と、どれも期待通りの結果が返ってきた。

次は(本命の)Core Data。

[obj setValue:@"http://www.apple.com/.*" forKey:@"name"];

とか作って

[NSPredicate predicateWithFormat:@"'http://www.apple.com/itunes/' matches name"];

などとしてNSPredicateを作り、fetchしてみるとちゃんと結果が返ってきた!

PHP 5.1.0 を入れてみる

post : 2005-11-27 0:55 | ,

PHP 5.1.0 インストール大会に私も参加。依存ライブラリは DarwinPorts で、MySQL はソースからインストール(過去記事:MySQL5 を入れてみる)している。configure は以下の通り。MySQL と SQLite と GD 関連、あと面白そうなのを適当に。

./configure '--prefix=/Library/Programs/PHP5.1.0' '--with-apxs'
 '--with-openssl=/opt/local' '--with-zlib=/opt/local' '--enable-calendar'
 '--enable-exif' '--enable-ftp' '--enable-zend-multibyte' '--enable-mbstring'
 '--enable-mbregex' '--enable-sockets' '--with-libxml-dir=/opt/local'
 '--with-mysqli=/Library/Programs/MySQL5/bin/mysql_config'
 '--with-mysql=/Library/Programs/MySQL5' '--with-ldap=/usr'
 '--with-gd' '--with-jpeg-dir=/opt/local' '--with-png-dir=/opt/local'
 '--enable-xslt' '--with-xslt-sablot=/opt/local' '--with-tiff-dir=/opt/local'
 '--with-t1lib=/opt/local' '--with-iconv' '--with-iconv-dir=/usr'
 '--with-mcrypt=/opt/local' '--with-curl=/opt/local'
 '--with-freetype-dir=/opt/local' '--with-gettext=/opt/local' '--with-xmlrpc'
 '--with-mime-magic' '--with-expat-dir=/opt/local' '--with-pear'
 '--enable-soap' '--with-zip=/opt/local'
 '--enable-sqlite-utf8' '--with-pdo-mysql=/Library/Programs/MySQL5'

つまずいたのが MySQL のオプション。 --with-mysql に古い方(4.0.x以前)のパスを指定すると mysqli のコンパイルでこける。しょうがないのでこっちも新しい方(4.1.x以降)を指定。ビルドは成功し、新旧どちらも使えることを確認。これに関するドキュメント「PHP: 改良版MySQL拡張サポート(mysqli) - Manual」には、「mysqli を使う場合は --without-mysql して古い方の機能を外せ」と真っ先に書いてあって、共存できないのかと思ってしまう。続きを読むと「組み込みライブラリを使わなければ共存できる」とあり、共存は可能らしいと分かる。でも、ちょっと待って。PHP 5 には MySQL 組み込みライブラリは付いていないのだ。結局何が言いたいのかというと、PHP 5 から採用された mysqli に関する説明で、PHP 5 には含まれない組み込みライブラリが出てくるのは変じゃないか? ということなのです。ここまで書いてはたと気付いた。このページはオリジナルの邦訳なのだ。元はどう書いてあるのだろう。

To install the mysqli extension for PHP, use the --with-mysqli=mysql_config_path/mysql_config configuration option where mysql_config_path represents the location of the mysql_config program that comes with MySQL versions greater than 4.1.
If you would like to install the mysql extension along with the mysqli extension you have to use the same client library to avoid any conflicts.

「共存させたい場合は、同一のクライアントライブラリを使いなさい」とだけ書いてある。翻訳の版が古いのだ!!

MySQL5 を入れてみる

post : 2005-10-28 11:02 | ,

現在ローカルでは
Apache2 - PHP4.3.x - MySQL4.0.x、Apache1 - PHP5 - MySQL4.0.x
とサーバをふたつ立ち上げているが、MySQL だけ1個なのでこれもデュアル体制にしたい。ということで4.1系を通り越し最新の5系を入れてみる。
/usr/local には現在のMySQL4が陣取っているので別の場所に入れる。charset の問題もあるのでソースからインストール。 --with-charset は binary にすれば良いらしいが、ここは思い切って utf8 にしてみる。configure は次の通り。

./configure --prefix=/Library/Programs/MySQL5 --with-charset=utf8 --with-extra-charset=all

フォルダ /Library/Programs/MySQL5 はあらかじめ作っておく。で

make
sudo make install
sudo /Library/Programs/MySQL5/bin/mysql_install_db --user=mysql

続いてcnfファイルの設定

sudo cp /Library/Programs/MySQL5/share/mysql/my-large.cnf /Library/Programs/MySQL5/my.cnf
sudo chmod 0666 /Library/Programs/MySQL5/my.cnf

mi で開いて port と socket を既存のサーバとかぶらないように書き換える。ローカルからのみ繋げれば良いので skip-networking のコメントを外す。

sudo chmod 0644 /Library/Programs/MySQL5/my.cnf
sudo /Library/Programs/MySQL5/bin/mysqld_safe

で起動することを確認。

/Library/Programs/MySQL5/bin/mysqladmin -u root -S 'my.cnfで設定したsocketのパス' password パスワード

として root のパスワードを設定。ちゃんと新しい方に繋がっているのか混乱しそうになる。
簡単なスクリプトを書いて PHP5 から繋げてみる。 mysql_connect('localhost:/tmp/mysql5.sock', $user, $pass); てな感じでホストに socket をくっつければ php.ini などをいじらなくても繋がる。PHP4.3 からは繋がらなかった。MySQL4.1以降のパスワード仕様変更の影響だろうと思われる。
とりあえず今日はここまで。top で pid を確認して sudo kill。

参考リンク
MySQL AB :: MySQL 5.0 Downloads
MySQL4.1以降のパスワード方式に対応した CocoaMySQL ベータ版