• ベストアンサー

sqlに記述できない文字

いつもお世話になっております。 WEB画面から入力された項目を対象にPostgresに検索しに行っているのですが、シングルクォート(')が入っていた場合、エラーになってしまいました。 JavaからSQLを生成し、Postgresに接続しているのですが、シングルクォートを検索させるにはどうするのが良いでしょうか。 またSQLに記述できない文字は、シングルクォートのほかに何かありますでしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

下記のページにPostgreSQLのSQLの文字列定数についての説明が有りますので、記述できない文字などについてはここを見ると良いでしょう。 http://www.postgresql.jp/document/pg837doc/html/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS さて、シングルクウォートを含む文字列定数への対応としては下記の3つが考えられます。 1. 文字列中のシングルクウォートとバックスラッシュ(\)を\でエスケープする。 2. ドル引用符を使用する。 3. プレースフォルダを使用する。 2は、$xxxx$ のようなドル記号で囲まれた文字列を引用符代わりに使う、PostgreSQL 独自の機能です。 'hoge' と書く代わりに $xxxx$hoge$xxxx$ の様に書けます。 詳しくは下記のページを見て下さい。 http://www.postgresql.jp/document/pg837doc/html/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING 3は、SQLの定数の位置に?を書き、PreparedStatement の set~~() メソッドを使って値を指定する方法です。下記のページが参考になるでしょう。 http://www.atmarkit.co.jp/fjava/rensai2/webopt11/webopt11.html http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/guide/jdbc/getstart/preparedstatement.html

参考URL:
http://www.postgresql.jp/document/pg837doc/html/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS

その他の回答 (1)

  • OKwebb
  • ベストアンサー率44% (92/208)
回答No.1

> シングルクォートを検索させるにはどうするのが良いでしょうか。 エスケープする。具体的には ''又は\'に。 > SQLに記述できない文字は、シングルクォートのほかに何かありますでしょうか。 どういう風にSQL文を組み立てているかによると思うが、SQLインジェクション対策としては\(円/バックスラッシュ)もした方がよいでしょう。 SQLインジェクション対策については参考URL参照のこと。

参考URL:
http://www.tokumaru.org/d/20080601.html

関連するQ&A

  • 正規表現でSQLのエスケープ

    C# 2.0 & SQLServer2000 でプログラムを作成しています。 通常のADOではなく、サードパーティーのDBコンポーネントを使ってDB周りはやっているのですが、その際に SQL 文は自分でエスケープしてやる必要があることに後から気付き、正規表現でSQL文をまとめてエスケープすることはできないかと考えています。 正規表現を使って実現したい事は以下です。 ・文字列中の ' (シングルクォート)を '' (シングルクォート2つ)に置換 ・ただし、 where field = 'xxxx' のように文字列を間に入れている場合の ' は置換しない WEBなどで調べても見つかりませんでした。どなたか正規表現に強い方、教えてください。

  • SQL記述の質問

    SQLを書くにあたって悩んでいます。 簡単なようで何となく頭がこんがらがってしまっているので、 教えていただけないでしょうか? テーブル (識別番号+年月日でPK) 識別番号 年月日 検索項目 ソートキー ----------------------------------- 001  11/31  001  003 001  10/31  001  003 001  10/01  001  003 002  11/31  001  002 002  10/31  001  002 002  10/01  001  002 003  11/31  001  001 003  10/31  001  001 003  10/01  001  001 上のようなテーブルを以下の条件で検索したいです。 1)検索項目='001' 2)同一識別番号で年月日が最大のもの 3)ソートキーの昇順 ★結果のイメージ 識別番号 年月日 検索項目 ソートキー ----------------------------------- 003  11/31  001  001 ←取得対象 002  11/31  001  002 ←取得対象 001  11/31  001  003 ←取得対象 よろしくお願いいたします。

  • MSアクセス2013のSQLでESCAPE文字指定

    MSアクセス2013のSQLでLIKE検索時のエスケープ文字を別の文字に変更する ESCAPEキーワードを記述したら『演算子がありません』とエラーになったのですが 使えないんですか? select * from テーブル where 項目 like 'abc' ESCAPE '#' ;

  • SQLインジェンクション対策法をおしえてください。

    ' OR 1=1のように外部から認識されていない値をSQLクエリにする前に一度確かめる機能を加えたいのですがなかなかうまくいきません。 外部から入力されたシングルクォートをエスケープするにはどうしたらよいのでしょうか?(ソースなどあると助かります。) また、そのほかに有効な対策法などありましたら教えていただけると幸いです。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • データベースについて

    データベースについていくつか質問があります。 1.シングルクォートとタブルクォートの違い シングルクォートは、文字リテラルを使いたいときに使い ダブルクォートは、特殊文字や大文字小文字を区別したいときに使うと参考書に書いてあったのですが、ダブルクォートでも文字リテラルを使えたのですがなぜでしょうか!?特に、ダブルとシングルの使用に区別は要らないのでしょうか!? 2.SQLが操作できるフリーソフトでオススメを教えてください。用途は、SQL(オラクルのブロンズ)の勉強に使います。

  • ダブルクォート、シングルクォート、\について

    こんにちは。 PHPでメールフォームを作ったのですが、2つ問題点があります。 1.テキストフィールドにダブルクォートで文字を囲んで送信すると入力された情報が返されず、何も入力されていないメールが送られてきます。 2.シングルクォート、\をいれると前に\がついてしまいます。(こんなカンジ→\'\\)フォームはHTMLで作成しています。確認画面のフォームにstripcslashes($_POST[name])をかけておりブラウザ上だとシングルクォートと\は除去されているのですが、メールだと除去されてません。 ダブルクォート、シングルクォート、\が付いた文字列をPHP・HTMLにどのように記述すれば、メールにきちんと送られるようになるのでしょうか?

    • 締切済み
    • PHP
  • マクロでエクセル内のテキスト加工(SQL文生成)

    SQL文をエクセルマクロで生成したいのですが、この質問にはSQLの知識は全く不要と思います。 検索対象のデータベースからある項目が検索キーワードにヒットするものだけ、 指定の項目を抽出するSelect文を書いて作業しているのですが、 キーワードが多数あるため、手作業で書くのが大変なので、マクロで自動生成したいです。 Sheet1内に以下の内容を記述 ・データベース名 ・検索対象の項目名 ・抽出する項目名を以下のように縦に列挙(個数は変動) ・1行のSQL文に含めるキーワード数(後述) 項目名1 項目名2 項目名3 項目名4 項目名5 ・ ・ ・ Sheet2には検索キーワードが以下のように縦に列挙(個数は変動) キーワード1 キーワード2 キーワード3 キーワード4 キーワード5 ・ ・ ・ Sheet1、Sheet2の内容から、Sheet3に以下のSQL文を生成したいのです。 Select 要素1, 要素2, 要素3, 要素4, 要素5 FROM データベース名 WHERE 項目名 = 'キーワード1' OR 検索対象の項目名 = 'キーワード2' OR 項目名 = 'キーワード3' ただし、キーワードの数が数千になることもあるため、 前述のSheet1で指定した数値の数毎に次の行にしたいです。 例えばこんな感じ Select 要素1 FROM データベース名 WHERE 項目名 = 'キーワード1' OR 検索対象の項目名 = 'キーワード2' OR 項目名 = 'キーワード3' Select 要素1 FROM データベース名 WHERE 項目名 = 'キーワード4' OR 検索対象の項目名 = 'キーワード5' OR 項目名 = 'キーワード6' ・ ・ ・ Select 要素1 FROM データベース名 WHERE 項目名 = 'キーワード1000' OR 検索対象の項目名 = 'キーワード1001' ご存知の方いたらご教授ください。

  • join関数で文字列を''で括りたい

    いつもお世話になっております。 SQLのQueryを生成するため、 配列をjoinしようと思ってます。 joinの値は文字列なので、シングルクオーテーションで括りたいと考えてるのですが、 うまい方法を探しております。 ご存知なら御教授いただきたいです。 今はjoinの配列にデータを入れる際にシングルクオーテーションを文字列結合しております。

    • 締切済み
    • PHP
  • SQL で数値フィールドにDBNULLをセットする

    VB2008 で商品マスタメンテ プログラムの開発をしています。 入力画面に入力された各項目で、MDBの商品マスタテーブルを更新するのですが、 入力されなかった項目にDBNULLをセットする場合のSQL文の記述方法を教えて下さい。 例)商品マスタの項目: 商品コード(テキストタイプ)                商品名称(テキストタイプ)                商品名カナ(テキストタイプ)                入数(数値タイプ) 画面から入力された内容を退避する一時ワークエリア SyohinCD As String SyohinNM As String SyohinKN As String Irisu As Object   とし、入力内容をセットしています。   ここで、入数が入力されなかった場合、 SQL = "" SQL = SQL & "UPDATE 商品マスタテーブル SET 商品名称 = ’ " & SyohinNM & "’," SQL = SQL & " 商品名カナ = ’ " & SyohinKN & "’," SQL = SQL & " 入数 = " & Irisu & ","   SQL = SQL & " WHERE 商品コード = ’" & SyohinCD & "’"   SQL = SQL & " ;" とすると、入数 のところで「構文エラー」になってしまいます。 ( ' (シングルクォーテーション)は、見やすさのために全角(’)にしています。)    入数は 0(ゼロ)と DBNULL を区別したいので、入力がない場合は、DBNULL を    セットしたいのですが、どのように記述すれば良いでしょうか。    おわかりの方がおられましたら、教えていただきたく、よろしくお願い致します。

  • PHPのSQL文のデバッグ方法とコーディング方法について

    http://okwave.jp/qa3663217.html 上記のANo.2の回答についての疑問です 本来上記の回答者に対して便乗質問すればよかったのですが、 早々に締め切られてしまったので新しく質問させていただきます。 ☆上記のANo.2でSQLのデバッグ方法が回答されいる(下記に抜粋)のですが、 (1)は一般的なSQLデバッグ方法なのでしょうか? (2)は一般的なSQLの記述方法なのでしょうか? ●ANo.2の抜粋 (1)SQL文はヒアドキュメントをつかう (2)テーブルやフィールドはバッククォート、値はシングルクォートでくくる (3)変数は{$hoge}形式で参照する (4)SQL文の最後になるべく;はつけない (5)エラーはmysql_error()で確認する。 ●抜粋終わり ○私が疑問に思う理由は下記のとおりです。 (1)はHTML文を出力するには有効な機能だと思います しかし、SQLをデバッグする場合(特に動的SQLをデバッグする場合)、 最終的に加工されたSQL文をvar_dump,echo,print等で一切加工せずにデバッグしないと、 ヒアドキュメントへ加工中にSQLが(タイプミスとかカットアンドペーストミス)変わってしまう可能性があり、正しくデバッグできない可能性があると思います。 特にデバッグする人は、SQLをヒアドキュメントへ転記中に無意識のうちに正常なSQLに変換してしまっていて、バグの原因が掴めないなんてケースは結構見てきました。 デバッグする人は何がバグっているのかを探っているはずので、出来るだけデバッグ対象コードはまず生のまま見るべきだと思っています。 また、デバッグ終了後にデバッグ文を消す作業が発生し、 誤ってデバッグコード以外の必要なコードも削除してしまう恐れもあります。 var_dumpであれば、一括置換でコメントアウトしたり出来ますし、 あるいは、var_dumpをラップする関数を用意しておき、 デバッグフラグがONの場合のみvar_dumpを走らせるようにしておけば、 var_dumpを削除する作業そのものが不要で、 必要な時にデバッグON/OFF出来るかと思います。 (2)は「値はシングルクォート」(※1)は納得できるのですが、 「テーブルやフィールドはバッククォート」(※2)は、※1と混在してSQLを書いた場合、どれが列名でどれが変数(または定数)なのか、判別しにくくなり、 余計なバグを混入させたり、可読性を落としたりすると思います。

    • ベストアンサー
    • PHP