【CakePHP】DB検索の際の大文字小文字の区別のまとめ
最終更新: 2012-08-16 (CakePHP 2.2.1)
下記の3つのfindの形式で、検索する文字列の大文字小文字の区別は
hoge HOGE Hoge hOgE
なされるのかどうか、MySQLとSQLiteで調べてみました。
【1. find(通常)】
$this->Model->find('all', array(
'conditions'=>array(
'name'=>'hoge'
)
));
【2. find(LIKE)】
$this->Model->find('all', array(
'conditions'=>array(
'name LIKE'=>'hoge'
)
));
※findByは、条件に合致した中の1件のみを取得します。
【3. findBy〜】
$this->Model->findByName('hoge');
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〜 | 区別する | 区別する | 区別する |
なお、CakePHPのデバッグで確認したところ、各メソッドでは
それぞれ以下のようなWHERE句が生成されるようです。
メソッド | WHERE句 |
---|---|
find(通常) | WHERE `name` = 'Hoge' |
find(LIKE) | WHERE `name` LIKE 'Hoge' |
findBy~ | WHERE `Post`.`name` = 'Hoge' |
そこで、素のSQLでもMySQlとSQLiteを比較してみました。
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