前提・実現したいこと
前提として
下のようなMySQLのuserテーブルがあります。
ID | name | address |
---|---|---|
1 | tanaka | hogehoge@example.com |
2 | suzuki | fugafuga@example.com |
3 | yoshida | piyopiyo@example.com |
テーブルの情報が下記です。
Field | Type | Collation |
---|---|---|
id | int(10) unsigned | NULL |
name | varchar(255) | utf8_unicode_ci |
address | varchar(255) | utf8_unicode_ci |
この際に
SQL
1SELECT * from user WHERE name="Suzuki";
というクエリを送ると全角半角、大文字小文字区別せずに下記のように引っ張ってきてしまいます。
ID | name | address |
---|---|---|
1 | suzuki | fugafuga@example.com |
そこで、
SQL
1SELECT * from user WHERE name="Suzuki" collate utf8_bin;
とすると、全角半角大文字小文字を区別してくれます。
つまり、クエリを送った結果は「Empty set」となります。
以上をLaravelのクエリビルダを用いて実行する場合に
PHP
1 2$name = "Suzuki" 3$query = "SELECT * FROM user WHERE name=$name collate utf8_bin"; 4 5$result = DB::connection('example')->select($query);
とするとほしい結果が得られますが、SQLインジェクションの問題があると考えたので、
php
1 2$name = '"'."Suzuki".'"'; 3 4$result = DB::connection('example')->select('SELECT * FROM user WHERE name = ? collate utf8_bin', [$name]);
としました。
発生している問題・エラーメッセージ
SQLSTATE[42000]: Syntax error or access violation: 1253 COLLATION 'utf8_bin' is not valid for CHARACTER SET 'binary' (SQL: SELECT * FROM user WHERE name = "Suzuki" collate utf8_bin)
試したこと
ダブルクオーテーションをシングルクオーテーションにしたり、
utf8_binがいけないのかと思いutf8_general_ciに変えて実行しましたが、解決せずでした。
また、MySQLの対象テーブルのcollation設定をutf8_binに変更することでMySQL側で区別してくれるのだとは思いますが、都合上、MySQL側の変更は無しという前提でお願い致します。
補足情報(FW/ツールのバージョンなど)
回答2件
あなたの回答
tips
プレビュー