【CakePHP】DB検索の際の大文字小文字の区別のまとめ


最終更新: 2012-08-16 (CakePHP 2.2.1)



hoge HOGE Hoge hOgE
下記の3つのfindの形式で、検索する文字列の大文字小文字の区別は
なされるのかどうか、MySQLSQLiteで調べてみました。

【1. find(通常)】
$this->Model->find('all', array(
'conditions'=>array(
'name'=>'hoge'
)
));


【2. find(LIKE)】
$this->Model->find('all', array(
'conditions'=>array(
'name LIKE'=>'hoge'
)
));


【3. findBy〜】
$this->Model->findByName('hoge');
findByは、条件に合致した中の1件のみを取得します。
SQLで『LIMIT 1』が付加されます。


CakePHP 2.2.1
MySQL MySQL(BINARY属性付) SQLite
find(通常) 区別しない 区別する 区別する
find(LIKE) 区別しない 区別する 区別しない
findBy〜 区別しない 区別する 区別する


CakePHP 1.3
MySQL MySQL(BINARY属性付) SQLite
find(通常) 区別しない 区別する 区別する
find(LIKE) 区別しない 区別する 区別しない
findBy〜 区別する 区別する 区別する
MySQLでBINARY属性をつけると、全ての"find"で大文字小文字が区別されるようになります。


なお、CakePHPデバッグで確認したところ、各メソッドでは
それぞれ以下のようなWHERE句が生成されるようです。

メソッドWHERE句
find(通常)WHERE `name` = 'Hoge'
find(LIKE)WHERE `name` LIKE 'Hoge'
findBy~WHERE `Post`.`name` = 'Hoge'


そこで、素のSQLでもMySQlSQLiteを比較してみました。


SELECT * FROM posts WHERE name = 'hoge'
SELECT * FROM posts WHERE name LIKE 'hoge'

MySQL MySQL(BINARY属性付) SQLite
= 区別しない 区別する 区別する
LIKE 区別しない 区別する 区別しない



CakePHPのメソッドを使わない素のSQLならば、テーブル作成時だけでなく、SELECT文などで一時的に大文字小文字の区別を変更することができます。
詳しくは別の記事にまとめたので、そちらをご覧ください。


【参考】
(MySQL, SQLite3)大文字小文字を区別する・しない方法いろいろ
http://d.hatena.ne.jp/sutara_lumpur/20120818/1345280287