2016-04-27 15 views
0

NVARCHARの列firstNameを持つテーブルがあります。私は部分名で検索するためのクエリを書いています。準備されたステートメントを使用してSQLSERVERのUnicodeデータを検索する

$params[':firstName'] = "%วุฒิหิรัญทิ%"; 
$query = "SELECT * FROM users WHERE firstName LIKE :firstName"; 
$matches = $this-db->fetchAll($query, $params); 

これが動作しない、と私はMSSQLで、私はUnicode文字を検索するNを使用する必要があることを読んだ:私のクエリは次のようになります。準備された声明でこれをどのように達成するのですか? :firstNameN:firstNameに置き換えようとしましたが動作しませんでした。

EDIT:このソリューションは、Latin 1文字セットの文字で使用できます。そのセットの外側にある文字では機能しません。特殊文字の場合は、SELECT * FROM users WHERE firstName LIKE N'%วุฒิหิรัญท%'のような直接クエリを実行できますが、正常に動作しますが、プリペアドステートメントで動作するようにはできません。

+0

変数にfirstnameがどのように解析されているのかよくわかっていませんが、「 '」で囲んではいけませんか? '... LIKE ':firstname'' – tobypls

+0

いいえ、準備されたステートメントは、引用符の使用を一般的に避けます。 – charmeleon

+0

[OK]をクリックし、準備文にワイルドカード検索を使用していますか? http://stackoverflow.com/questions/1352002/using-wildcards-in-prepared-statement-mysqli – tobypls

答えて

-1

SQLワイルドカードを正しく使用していません。

SELECT * FROM users WHERE firstName LIKE '%' + :firstName + '%' 

%記号はSQLのワイルドカード演算子です。上記はあなたのために働くはずです。

+0

私は参照してください。これはうまくいかなかったが、「データ型varcharとvarbinaryがadd演算子で互換性がありません」というエラーが発生しました。私は ''% ''がvarcharであり、パラメータがvarbinaryとして扱われていると考えています – charmeleon

+0

パラメータから'% 'を削除できました。それはあまりにも珍しい文字ですが、それはより一般的な文字で動作するかどうかを見ることができますか? –

+0

これは、元の投稿のように、latin1文字セットの文字に対して機能します。タイ語/キリル文字では機能しません – charmeleon

関連する問題