Oracle の LIKE 演算子で _、% を検索文字列として指定する

SELECT * FROM foo WHERE bar LIKE '%baz\%' ESCAPE '\';
SELECT * FROM foo WHERE bar LIKE '%baz\_' ESCAPE '\';

  ESCAPE でエスケープ文字に指定する必要がある (この場合は \ を指定)。
  Oracle では、デフォルトのエスケープ文字は決まっていないらしい。
  
  MySQL の場合は、デフォルトのエスケープ文字は、\ になっている。
  ただし、MySQL も ESCAPE 節を使えるため、スケープ文字にすることも可能 (この場合は | を指定)。

SELECT * FROM foo WHERE bar LIKE '%baz|%' ESCAPE '|';

- ref.: 忘れっぽいエンジニアのオラクルSQLリファレンス
  http://oracle.se-free.com/dml/01_like.html

- ref.: MySQL ::   MySQL 5.1 リファレンスマニュアル :: 11.3.1 文字列比較関数
  http://dev.mysql.com/doc/refman/5.1/ja/string-comparison-functions.html

XAMPP に含まれる Apache,MySQL,PHP のバージョンの遷移

  今年もまた約一年ぶりに調査。もはやこの情報が役に立つかどうかは不明ですが……

XAMPP      リリース日 Apache 2.x MySQL 4.x MySQL 5.x PHP 4.x    PHP 5.x
0.9        2003-07-22 2.0.47      4.0.14                4.3.3 rc2
1.0        2003-09-03 2.0.47      4.0.14                4.3.3     
1.1        2003-10-13 2.0.47      4.0.16                4.3.3     
1.2        2003-11-04 2.0.48      4.0.16                4.3.4     
1.3        2004-02-10 2.0.49      4.0.18                4.3.6     
1.4        2004-03-25 2.0.49      4.0.18                4.3.4     
1.4.2      2004-04-06 2.0.49      4.0.18                4.3.6     
1.4.3      2004-06-12 2.0.49      4.0.20a               4.3.7     
1.4.4      2004-07-03 2.0.50      4.0.20                4.3.7     
1.4.5      2004-07-14 2.0.50      4.0.20                4.3.8      5.0.0
1.4.6      2004-08-16 2.0.50      4.0.20                4.3.8      5.0.1
1.4.7      2004-09-18 2.0.51      4.0.21                4.3.8      5.0.1
1.4.8      2004-09-25 2.0.51      4.0.21                4.3.9      5.0.2
1.4.9      2004-10-02 2.0.52      4.0.21                4.3.9      5.0.2
1.4.10     2004-12-05 2.0.52      4.1.7                 4.3.9      5.0.2
1.4.11     2004-12-25 2.0.52      4.1.8                 4.3.10     5.0.3
1.4.12     2005-02-20 2.0.53      4.1.9                 4.3.10     5.0.3
1.4.13     2005-04-10 2.0.54      4.1.11                4.3.11     5.0.4
1.4.14     2005-06-19 2.0.54      4.1.12                4.3.11     5.0.4
1.4.15     2005-08-14 2.0.54      4.1.13                4.4.0      5.0.4
1.4.16     2005-10-03 2.0.54      4.1.14                4.4.0      5.0.5
1.5.0      2005-11-06 2.0.55                 5.0.15     4.4.1      5.0.5
1.5.0-pl1 2006-01-08 2.0.55                 5.0.15     4.4.1-pl1 5.0.5
1.5.1      2006-01-08 2.2.0                  5.0.18     4.4.1-pl1 5.1.1
1.5.2      2006-04-26 2.2.0                  5.0.20     4.4.2-pl1 5.1.2
1.5.3      2006-05-28 2.2.2                  5.0.21     4.4.2-pl1 5.1.4
1.5.4      2006-09-10 2.2.3                  5.0.24a    4.4.4      5.1.6
1.5.4a     2006-10-04 2.2.3                  5.0.24a    4.4.4      5.1.6
1.5.5      2006-11-26 2.2.3                  5.0.27     4.4.4      5.2.0
1.6.0      2007-02-18 2.2.4                  5.0.33     4.4.5      5.2.1
1.6.0a     2007-02-21 2.2.4                  5.0.33     4.4.5      5.2.1
1.6.1      2007-04-17 2.2.4                  5.0.37     4.4.6      5.2.1
1.6.2      2007-05-28 2.2.4                  5.0.41     4.4.7      5.2.2
1.6.3      2007-07-22 2.2.4                  5.0.45     4.4.7      5.2.3
1.6.3a     2007-07-26 2.2.4                  5.0.45     4.4.7      5.2.3
1.6.4      2007-10-07 2.2.6                  5.0.45     4.4.7      5.2.4
                                                                    
最新版                 2.2.6       4.1.22     5.0.45     4.4.7      5.2.4


  最新版は,2007-11-04 での各プロダクトの最新バージョン.
  調査対象は XAMPP for Windows.

- XAMPP
  http://sourceforge.net/projects/xampp/
  http://www.apachefriends.org/en/xampp.html

MySQL の warnings をすぐに表示させる方法

  mysql コマンドを直接たたいているときに、warning と表示されることがあります。
  例えば、次のような場合です。

mysql> CREATE TABLE test (id int) TYPE=InnoDB;
Query OK, 0 rows affected, 1 warning (0.03 sec)

  この場合 warning が 1 つ発生しています。どういった warning が発生しているかを確認するには、SHOW WARNINGS をしてみるとわかります。

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Warning
   Code: 1287
Message: 'TYPE=storage_engine' is deprecated; use 'ENGINE=storage_engine' instead
1 row in set (0.02 sec)

  Message がそれにあたります。ちなみに、SHOW WARNINGS は MySQL 4.1.0 から導入されています。

- MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 4.6.8.9 SHOW WARNINGS | ERRORS
  http://dev.mysql.com/doc/refman/4.1/ja/show-warnings.html

  さて、本題ですが、warning を見るためにいちいち SHOW WARNINGS をタイプするのは面倒です。
  そこで、--show-warnings オプションを紹介します。マニュアルによると以下のように説明されています。

警告が存在する場合、各ステートメント後に表示させます。このオプションはインタラクティブとバッチモードにのみ対応しています。

  ただし、このオプションは MySQL 5.0.x から用意されているようです (手元にある 5.0.37 では実装されていました)。

  使い方は、いたって簡単で --show-warnings オプションをつけるだけです。

$ mysql --show-warnings -uroot -p test

  上記と同じように warning が表示される SQL を入力しています。

mysql> CREATE TABLE test (id int) TYPE=InnoDB;
Query OK, 0 rows affected, 1 warning (0.01 sec)

Warning (Code 1287): 'TYPE=storage_engine' is deprecated; use 'ENGINE=storage_engine' instead

  見てのとおり、警告がすぐに表示されました。

  もちろん、~/.my.cnf などに書いても問題ありません。

[mysql]
show-warngins



- MySQL AB :: MySQL 5.1 リファレンスマニュアル :: 7.7.1 mysql オプション
  http://dev.mysql.com/doc/refman/5.1/ja/mysql-command-options.html#id268974 ...

PHP カンファレンス 2007 レポート

  2007-09-01 に PHP カンファレンスが大田区産業プラザ (PiO) で行なわれました。
  自分が見たプログラムの内容をメモしておいたので簡単にまとめます。また、まとめながら調べたことも一緒に記述しています。

  なお、間違いがあるかもしれませんが、その際は教えていただけるとありがたいです。

- PHPカンファレンス2007プログラム概要
  http://www.php.gr.jp/seminar/20070901/prog.php

1. 基調講演「PHP の今とこれから 2007」

PHP 4.3/4.4 の利用率は 75% 程度

PHP 5 について

PHP 5.2 について

PHP 5.3 について

  • 本来は予定にはなかった
  • 2008/01 以降にリリースか?
  • PHP 6 までのつなぎのバージョン
    • Unicode サポート以外の新機能が入るかもしれない
  • ICU (国際化) 拡張
    • IBM が開発している国際化用のライブラリ
  • OpenSSL で OpenID がサポートされる
  • 名前空間も?

PHP 4.4/5.1/5.2/6.0 のベンチマーク

  • php-5.x.x/Zend/bench.php を使用
  • PHP 5.2 が今のところ一番早い

セキュリティーについて

PHP 6.0 について

  • Unicode 対応
    • ICU 3.4 をエンジンとする
    • 内部的には UTF-16
    • echo strlen('日本語'); // -> 3
    • mbstring は不要になるか? (微妙な状況)
    • エンコードの検知の精度がまだ低い
  • レガシーコードの削除
    • register_globals
    • magic_quotes_*
    • safe_mode
    • zend.ze1_compatibility_mode
  • MySQLND (MySQL Native Driver)
    • libmysql の代替ライブラリ
    • PHP 5/6 をサポート (PHP 6.0 には標準バンドル。PHP 5.3 にも?)
    • MySQL 4.1 以上をサポート
  • 新しいガベージコレクタ

Namespace (名前空間)

2. 大規模サイトの構築・運用ノウハウ (仮題)

  • ウノウ、GREE の CTO 対談
  • サーバマシンは統一する
  • テーブルは JOIN しない

ウノウの場合

GREE の場合

  • スライド中に「GREE に入りたい」のサブリミナル効果
  • ページビュー、サーバ台数、ユーザ数など (非公開っぽいので省略)
  • フレームワークはもちろん Ethna
  • TEXT を外に出す

     +-----+----------+
     | UID | 名前     |
     +-----+----------+
     |  7  | すなおか |
     +-----+----------+
        ↑
        ↓
+----+-----+-------------+
| ID | UID | 内容 (TEXT) |
+----+-----+-------------+
|  1 |  7  | ほげほげ... |
+----+-----+-------------+

  • テーブル (DB) を分割する

                            +----+-----+---------+
+-----+----------------+    | ID | UID | 内容    |
| UID | パーティション |    +----+-----+---------+
+-----+----------------+    |  1 |  7  | ...     |
|  7  |              1 | → +----+-----+---------+
+-----+----------------+
|  9  |              2 | → +----+-----+---------+
+-----+----------------+    | ID | UID | 内容    |
                            +----+-----+---------+
                            |  2 |  9  | ...     |
                            +----+-----+---------+

  • JOIN しない
  • 正規化がんばらない
  • 本番機への投入は rsync

3. PHP Framework Update

symfony

1590597869

  • 間もなく 1.1 のベータリリース

CakePHP

Piece Framework

  • ステートフルでセキュアな Web アプリケーションフレームワーク
  • 個別のライブラリだけを使用することもできる
  • Piece IDE のデモ (現在は Eclipse のプラグイン)
    • ウィザード式の画面がビジュアルに作成できる (楽しい)
    • 出力は YAML

Ethna

  • 今後の方向性
  • いろいろ直したいところとか

4. PHP at Yahoo!

Y! について

  • 13 億 3800 万ページビュー
  • 1960 万アクティブユーザ ID
  • 2007/08 現在 140 サービス

Y! と PHP の関係

  • PHP 界隈で有名な人が在籍
  • PHP のバグはまず Y! 社内にレポートされる (PHP に独自のパッチを当てているため)
  • 当初は FreeBSD 2.1 上の独自システムで構築
    • Web サーバ: Filo Server -> Apache (1996 年)
    • DB: フラットファイル -> MySQL (1998 年)
    • yScript -> PHP (2002 年)
  • Oracle も使うよ
  • FreeBSD、Apache、PHP には独自のパッチを当てている
  • C++ で書かれたライブラリを PHP 拡張から呼び出す
  • 日本ではフロントエンドはほとんどが PHP

なぜ PHP を採用したか

  • Web 用の言語
  • 高いパフォーマンス
  • 大きなコミュニティ
  • ライブラリが充実している、拡張性がある
  • ツールが豊富 (IDE、プロファイラ、デバッガ)
  • トレーニングコストが低い

現在の PHP

  • フレームワークはほとんど使っていない
    • HTML ページ: 5% PHP
    • ヘルパー (ヘッダ出力など): 50% PHP
    • ビジネスロジック: 100% PHP
    • コア: C/C++
  • PHP は最低限でビルド

$ ./configure --disable-all

  • 必要なモジュールは共有モジュールとしてインストール
    • 不必要な依存性を下げる
    • メモリの使用量を下げる
    • 再コンパイルが不要
    • しかし、Apache 起動時に若干のオーバーヘッドが

PHP 5 への移行について

  • 日本では 4.4 系がメイン
    • 2007 年末までに 5 系へ
    • 2008 年には 5.2 系へ移行する

セキュリティについて

  • 開発ルール・プラットフォームの整備による開発
  • Scanmus
    • Rasmus が開発した XSS 検出ツール
  • open_basedir を設定
  • allow_url_fopen = Off、allow_url_include = Off
    • 必要があれば libcurl を利用
  • safe_mode = Off
  • display_errors = Off
    • しかし log_errors = On でログには残す
  • error_reporting = E_ALL
  • ユーザからの入力値はフィルタリングする
  • PHP 5.2.0 からのフィルタ拡張を利用する
    • Y! から PHP コミュニティに還元した拡張
    • Y! 社内では PHP 4 でも利用できるように PHP 自体にパッチを当てている
  • CSRF 対策は Crumb (セッション追跡用の秘密情報) を利用

パフォーマンス

  • APC を利用 (Rasmus が携わっているため)
    • xdebug + WinCacheGrind・KCacheGrind
  • PHP 拡張の開発
    • C/C++ に PHP を埋め込んで利用することも (Web アプリではない)
  • セッションの利用を避ける
  • Cookie を利用して画面遷移に必要な情報は POST で (hidden) で埋め込む
  • r3 (テンプレート管理ツール) を開発
    • 日本語の解説がある (どこだろう?)
  • OSS のフレームワークのはあまり利用しない
    • 汎用的すぎてパフォーマンスに問題があるので
  • 実装はエンジニアに委ねる
    • プロダクトに特化した独自のフレームワークを利用している場合も
    • トップページ専用の CMS とか
  • Smarty はオーバーヘッドが Y! では無視できないので利用しない
  • symfony は使い始めた
    • Yahoo! Bookmarks
    • del.icio.us
    • Yahoo! Answers (Yahoo! 知恵袋)
    • いろいろカスタマイズしている
  • CakePHP
    • 検討中
    • ただし、利用実績も予定もなし

まとめ

  • 5 年ほど PHP を使っている
    • いろいろカスタマイズしている
  • PHP 拡張を多用している
  • OSS のフレームワークはあまり使っていない
    • symfony は使い始めた
  • IDE は使っていない
  • CVS を使っている

5. ライトニングトーク

  • 人が多すぎで 6F から 2F に移動

モバイル開発における PHP の利用方法と Tips

  • 資料
  • 携帯サイトと PC サイトの違い
  • PEAR Net_UserAgent_Mobile
  • 文字コード
    • sjis-win、eucjp-win を利用する
    • DB は cp932
  • 絵文字
  • Cookie は使えない

Usagi Project

  • OpenPNE 2.4系の派生プロジェクト
  • PHP ライセンス
  • いっしょに開発しませんか

PEAR DB_DataObject 開発ケーススタディ

  • DB をまたぐテーブルの結合をサポートした
  • テスト重要

PHP で画像処理をしてモテようかなと思って

PHP プログラマのための恋愛術

  • ふつうに恋愛論
  • PHP の話は出ない

code なにがしについて

  • 資料PDF
  • ググれといわれない場を
  • みんな優しい

ケータイキット for Smarty について

  • モバイルサイトに特化した Smarty
  • モバイルサイト開発の問題点を解消
  • 個人利用は無償

PHP でシェルを作る

  • /dev/null T シャツ
  • PHP で書かれた phsh を開発
    • もうじき公開? -> 公開されました
  • ログインシェルにもできる
  • eval で処理してるっぽい
  • シェルは偉大

6. スペシャルセッション

  • Piece IDE のデモのリベンジ
  • 基調講演の続き
    • 開発体制
    • ユーザ会など

以上、大雑把ですがまとめてみました。講師のみなさんありがとうございました。
懇親会にも出席していろいろな方と名刺交換・お話ができて充実した一日でした。

最後に戦利品です。

1. Yahoo! JAPAN さんに頂いたメモパッド

メモパッド

2. Asial さんに頂いた時計

時計

3. アイデアマンズさんに頂いた LED

LED

SQL Hacks ―データベースを自由自在に操るテクニック

  4873113318
  amazon.co.jp 詳細ページへ
  Andrew Cumming (著), Gordon Russell (著), 西沢 直木 (翻訳)
  オライリー・ジャパン
  ISBN: 4873113318
  2007/7/28
  3,150 円

  概要・目次は以下。

- oreilly.co.jp -- Online Catalog: SQL Hacks
  http://www.oreilly.co.jp/books/9784873113319/

MySQL 3.23.58 でデータベース名にハイフン (-) が含まれているとレプリケーションに失敗する

  というようなバグを発見した。

  MySQL 4.1.x では問題ないので、5.0、5.1 でも問題ないような気がします (未確認)。

  ハイフンが含まれている場合は `table-name` のようにバッククォートで括ってあげるといいわけですが、MySQL 3.23.58 の binlog の場合はそうなっていないっぽいです。

  あまり調べる気にならないのは、MySQL 3.23.58 など積極的に使う理由はないわけで……

  とりあえずの解決法としては、データベース名からハイフンをなくしてしまうか、アンダースコアなどの文字に置き換えてしまえばいいです。

  バッドノウハウもいいとこなので、これ以上は首を突っ込まないことに。
  でも忘れる可能性があるのでメモ。

phpMyAdmin のテーマを集めてみました

  phpMyAdmin をお使いの人は知っていると思いますが、phpMyAdmin はテーマを変更することができます。
  複数の phpMyAdmin を使い分けているときに、テーマを変えておくことで誤操作を減らすことができます。

  テーマは、SourceForge の phpMyAdmin のプロジェクトからダウンロードできます。

- SourceForge.net: phpMyAdmin
  http://sourceforge.net/project/showfiles.php?group_id=23067

  ところが、テーマのサムネイルなど用意されていないので、どのようなテーマかダウンロードしてみるまでわかりません。

  そこで、上記ページからダウンロードできるテーマを集めて、サムネイルを作成してみました。

  まずは、バンドルされている 2 つのテーマから。

- original
  

- darkblue_orange
  

  次に、追加でダウンロードできるテーマです。

- aqua
  

- aqua_brushed
  

- arctic_ocean
  

- cactica_blues
  

- crimson_gray
  

- darkblue_gray
  

- dark_lime
  

- garv_blue
  

- green_orange
  

- grid
  

- openphpnuke
  

- original_small
  

- paradice
  

- pixeline
  

- silk
  

- very_small
  

- xampp
  

- xp_basic
  

- xp_blue
  

- xp_dirty
  

- xp_green
  

- xp_silver
  

MySQL 5.1 のサーバログテーブル機能について

  MySQL 5.1 で my.cnf に log を設定しても,デフォルトではファイルにログが書き込まれません.

  これは,サーバログテーブルという MySQL 5.1 からの新機能が影響しています.
  サーバログテーブル機能により,デフォルトでは mysql テーブルの general_log と slow_log テーブルに書き出されます.

サーバログテーブル:MySQL 5.1以前では、サーバはログファイルに一般クエリログやスロークエリログエントリーを書き込みます。MySQL 5.1以降では、サーバのこういったログ書き込み機能はより柔軟性のあるものとなります。ログエントリーは、以前のようにログファイルに書き込まれるか、もしくはmysqlデータベース上のgeneral_logとslow_logテーブルに書き込まれます。ログ収集が可能な場合、いずれかもしくは両方の宛先が選べます。--log-outputオプションは、宛先やログ出力の宛先をコントロールします。詳しくはをご確認ください。(執筆: Petr Chardin)
(http://dev.mysql.com/doc/refman/5.1/ja/mysql-5-1-nutshell.html)

  5.0 以前のようにファイルに書き出すには,my.cnf に log-output=FILE を設定します.
  mysqld に --log-output=FILE オプションをつけて起動しても大丈夫なようです.

  log-output=TABLE,FILE のようにすると,テーブルとファイルの両方にログを出力します.
  もちろん,log-output=TABLE でテーブルのみにログを出力するようになります.

- MySQL AB :: MySQL 5.1 Reference Manual :: 5.11.1 Selecting General Query and Slow Query Log Output Destinations
  http://dev.mysql.com/doc/refman/5.1/en/log-tables.html

MySQL 4.1.22 用の Tritonn パッチをテストしてみる

  Solaris 10 に MeCab と Senna と MySQL をインストールする …… 失敗 の続きです.

  MySQL 4.1.22 用の Tritonn パッチがリリースされたので,テストです.

- mir the tritonn - MySQL 4.1対応版リリース
  http://d.hatena.ne.jp/mir/20070412/p1

  前回も少し書いたのですが,Senna の MySQL パディングは Tritonn という別プロジェクトになっています.
  当初は,MySQL 5.0.x 用のパッチのみの提供でしたが,今回 MySQL 4.1.22 用のパッチがリリースされました.

  まず,MeCab,Senna 本体のインストールをします.インストールは [2007-03-24-1] と同じです.
  Senna は 1.0.4 にバージョンアップして,Solaris 10 では UINT_MAX の未定義のエラーは出なくなっています.

  次に,Tritonn パッチをダウンロードして,MySQL にパッチを当てます.

- SourceForge.jp: Project File List
  http://sourceforge.jp/projects/tritonn/files/

$ tar -zxvf tritonn-1.0.2.mysql-4.1.22.senna-1.0.4.tar.gz
$ tar -zxvf mysql-4.1.22.tar.gz
$ cd mysql-4.1.22
$ patch -p1 < ../tritonn-1.0.2.mysql-4.1.22.senna-1.0.4/mysql-4.1.22.senna.diff

  configure を再生成します.

$ libtoolize -c -f
$ aclocal
$ autoheader
$ automake -c -a -i
$ autoconf
$ touch sql/sql_yacc.yy

  次に configure をします.
  configure の際には,--with-senna と --with-mecab をオプションに追加します.

$ ./configure --prefix=/usr/local/mysql \
              --with-extra-charsets=all \
              --without-readline \
              --enable-assembler \
              --with-low-memory \
              --with-senna=/usr/local/senna \
              --with-mecab=/usr/local/mecab/0.9
$ make

  うーむ.[2007-03-24-1] と同じエラーでした.

sql_yacc.cc: In function `int yyparse(void*)':
sql_yacc.cc:22059: error: expected primary-expression before "__attribute__"
sql_yacc.cc:22059: error: expected `;' before "__attribute__"
make[4]: *** [sql_yacc.o] Error 1

- ちなみに MySQL 5.0.37 では
  まったく問題なく行きました!

$ mysql -uroot -p test
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.37-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM (c1)) ENGINE = MyISAM DEFAULT CHARSET ujis;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO t1 VALUES ("すもももももももものうち");
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t1 VALUES ("生麦生米生卵");
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO t1 VALUES ("東京特許許可局");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM t1 WHERE MATCH(c1) AGAINST("特許");
+----------------+
| c1             |
+----------------+
| 東京特許許可局 |
+----------------+
1 row in set (0.00 sec)

  ということで,MySQL 5.0.37 で使っています.検索は想像以上に高速です.

  また,折をみて,MySQL 4.1.22 用は試してみたいと思います.

MySQL 3.23 な環境で CakePHP の hasAndBelongsToMany を利用する

  そもそもですが,CakePHP は MySQL 4.0 以上が対象らしいです.
  ただ,公式のドキュメントは見つかっていませんが……

  それでも,MySQL 3.23 な環境で CakePHP を使って,なおかつ hasAndBelongsToMany も使いたい場合の対処法です.
  MySQL 3.23 な環境では,hasAndBelongsToMany を使うとき,SQL のエラーが出ます.具体的には JOIN に失敗しています.

  このとき CakePHP は以下のような SQL 文を発行します.

SELECT  `Tag`.`id`, `Tag`.`tag`
FROM `tags` AS `Tag`
JOIN `posts_tags` ON `posts_tags`.`post_id` = '2'
 AND `posts_tags`.`tag_id` = `Tag`.`id`
WHERE  1 = 1


  MySQL のリファレンスにあるように,JOIN は MySQL 4.0.11 以降で対応なので,この JOIN を INNER JOIN にしてあげればいいわけです.

- ref.: MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.4.1.1 JOIN 構文
  http://dev.mysql.com/doc/refman/4.1/ja/join.html

注意:INNER JOIN 構文で join_condition  を使用できるのは、MySQL 3.23.17 以降に限られます。同様に、JOIN  と CROSS JOIN に関しても、MySQL 4.0.11 以降でのみ条件を指定できます。


  ちょうど昨日 CakePHP の最新版 (1.1.14.4797) がリリースされたので,この最新版と,その前のバージョン (1.1.13.4450) での修正箇所を挙げておきます.

- 1.1.14.4797 の場合
  cake/libs/model/datasources/dbo_source.php の 1051 行目を修正します.

--- cake_1.1.14.4797-orig/cake/libs/model/datasources/dbo_source.php    2007-04-06 04:21:05.000000000 +0900
+++ cake_1.1.14.4797/cake/libs/model/datasources/dbo_source.php    2007-04-06 08:46:09.015389000 +0900
@@ -1048,6 +1048,7 @@
                     'joins' => array(array(
                         'table' => $joinTbl,
                         'alias' => $joinAssoc,
+                        'type' => 'INNER',
                         'conditions' => array(
                             array("{$joinAlias}.{$assocData['foreignKey']}" => '{$__cakeID__$}'),
                             array("{$joinAlias}.{$assocData['associationForeignKey']}" => '{$__cakeIdentifier['."{$alias}.{$linkModel->primaryKey}".']__$}')


- 1.1.13.4450 の場合
  cake/libs/model/datasources/dbo_source.php の 1043 行目を修正します.

--- cake_1.1.13.4450-orig/cake/libs/model/datasources/dbo_source.php    2007-02-03 11:55:49.000000000 +0900
+++ cake_1.1.13.4450/cake/libs/model/datasources/dbo_source.php    2007-04-06 09:13:16.018886000 +0900
@@ -1040,7 +1040,7 @@
                 }
                 $sql .= ' ' . join(', ', am($this->fields($linkModel, $alias, $assocData['fields']), $joinFields));
                 $sql .= ' FROM ' . $this->fullTableName($linkModel) . ' ' . $this->alias . $this->name($alias);
-                $sql .= ' JOIN ' . $joinTbl;
+                $sql .= ' INNER JOIN ' . $joinTbl;
 
                 $joinAssoc = $joinTbl;



  上記の修正はあくまで,hasAndBelongsToMany を使いたい場合で,そのほかの項目はあまりテストしていませんのでご注意を.
  可能であれば,MySQL 4.0.x にアップデートするのが一番だと思います.