1

次のようなクエリがあります.....location_ns という名前の列があり、値として「Marriott\256 Hotel & Convention Centre」が含まれています。しかし、クエリはIDを生成しません。値とクエリの両方で\を削除すると、機能しています。

SELECT id
FROM notice
WHERE 
lon = 78.48693966865540000000 
AND lat = 17.42434596639255000000 
AND location_ns = 'Marriott\256 Hotel & Convention Centre' 
AND notice_type="text"

どなたか解決策があれば教えてください

4

2 に答える 2

2

String Literalsの下に記載されているとおり:

文字列内では、NO_BACKSLASH_ESCAPESSQL モードが有効になっていない限り、特定のシーケンスに特別な意味があります。これらの各シーケンスは、エスケープ文字と呼ばれるバックスラッシュ (「<code>\」) で始まります。MySQL は、表9.1「特殊文字のエスケープ シーケンス」</a> に示されているエスケープ シーケンスを認識します。他のすべてのエスケープ シーケンスでは、バックスラッシュは無視されます。つまり、エスケープされた文字は、エスケープされていないかのように解釈されます。たとえば、「<code>\x」は単に「<code>x」です。

したがって、バックスラッシュをエスケープする必要があります。

AND location_ns = 'Marriott\\256 Hotel & Convention Centre'

ただし、リテラルを準備済みステートメントのパラメーターとして MySQL に渡すことをお勧めします。

于 2012-11-30T15:52:01.300 に答える
1

\は MySQL のエスケープ シーケンスです。値を持つレコードがある場合:

Marriott\256 Hotel & Convention Centre

次のようにクエリする必要があります

AND location_ns = 'Marriott\\256 Hotel & Convention Centre'

これにより、リテラルを探していることを MySQL に知らせます\

于 2012-11-30T15:51:37.803 に答える