0

だから私はこのクエリを持っています

 SELECT COUNT(b.user_ticket_id) as tiketscount
 FROM event_tickets a
 INNER JOIN user_tickets b ON a.event_ticket_id = b.event_ticket_id
 WHERE b.status = 'used' AND a.event_id = '1'

これにより、期待される結果(カウント= 1)が得られ、以下のコードクエリを試すことにしました

 SELECT COUNT(b.user_ticket_id) as tiketscount
 FROM event_tickets a
 INNER JOIN user_tickets b ON a.event_ticket_id = b.event_ticket_id
 WHERE b.status = 'used' AND a.event_id = '1  DROP TABLE contact "1=1"'

以前と同じ結果が得られましたが、以下のように 1 を 2 に変更すると、結果はありません。mysql が最初に見つかった文字を使用している可能性はありますか?

 SELECT COUNT(b.user_ticket_id) as tiketscount
 FROM event_tickets a
 INNER JOIN    user_tickets b ON a.event_ticket_id = b.event_ticket_id
 WHERE b.status = 'used' AND a.event_id = '2  DROP TABLE contact "1=1"'

なぜそれが可能か誰でも知っていますか?ありがとう

MYSQL 5.5.30 InnoDB を使用しています

4

3 に答える 3

1

MySQL は暗黙的なデータ変換を行っているため、可能です。MySQL は、指定された文字列リテラルを数値に変換しています。

何が起こっているかのデモンストレーションとして、次のクエリを試してください。

SELECT '123ABC  ' + 0
SELECT 'A1B2    ' + 0
SELECT '1.23D56 ' + 0
SELECT ' 78 90  ' + 0 

MySQL が文字列リテラルを読み取り、その値を数値に変換していることがわかります。文字列の左端の文字から開始し、文字列の最後に到達するまで、または数値に変換できない文字列になる文字に遭遇するまで、一度に (左から右に) 文字を読み取ります。 .

例の文字列リテラルを使用して、この同じタイプのクエリを試すこともできます。

 SELECT '1  DROP TABLE contact "1=1"' + 0 
 SELECT '2  DROP TABLE contact "1=1"' + 0 

これらは、それぞれ 1 と 2 の数値を返します。

これらの同じ文字列の一部が数値に変換されると、他のデータベース (Oracle や SQL Server など) がエラーをスローすることを考えると、この動作はやや「奇妙」に思えます。MySQL はより寛容で、任意の文字列値を数値に変換できると想定しています。

于 2013-07-24T19:14:30.453 に答える
1

event_id はある種の数値列タイプ (おそらく INT) であるため、MySQL は文字列'1 DROP TABLE contact "1=1"'を変換1して最初のクエリと同一にします。

3番目のクエリでも、値を変換するのが最善であり、同じことを行い、クエリを次のように抽出します。

SELECT COUNT(b.user_ticket_id) as tiketscount FROM event_tickets a INNER JOIN    user_tickets b ON a.event_ticket_id = b.event_ticket_id
WHERE b.status = 'used' AND a.event_id = 2

event_id2とstatus「使用済み」のレコードはないと思います。

列が INT であり、何らかの形式のテキストではない場合、数値を引用符で囲む必要はなく、実際には推奨されません。

于 2013-07-24T19:04:57.367 に答える