none
SQL文のINSERTに関しての質問

    質問

  • 質問

    文字列型のカラムに値を挿入する場合、単引用符で囲みますが、

    囲まなくても値が挿入できる場合があります。

    これはたまたまですか?それともちゃんとした理由があるのでしょうか?

    初歩的な質問で申し訳ありませんが、ご回答をお願い致します。

    (★1)具体的には、以下のようなテーブルを作成します。

    create table TEST_TABLE(
    [CustomerID] [nvarchar](256) NULL, 
    ) ON [PRIMARY]

    (★2)作成したテーブルに以下のように値(ABC)を挿入します。この場合は単引用符が必要です。

    INSERT INTO TEST_TABLE(
    [CustomerID])

    VALUES(
    'ABC')
    GO

    (★3)しかし、以下のように値(99999)を挿入する場合は、単引用符がなくても値が挿入できます。

    INSERT INTO TEST_TABLE(
    [CustomerID])

    VALUES(
    99999)
    GO


    2012年6月8日 14:23

回答

  • 'ABC'はvarchar(3)型と認識され、nvarchar(256)型に変換されてから格納されます。
    同じように99999はint型と認識され、nvarchar(256)型に変換されてから格納されます。

    数値として認識されていることがわかりやすい例としては、 10.0、10.00、10.000 とかで試してみるといいです。

    暗黙的なデータ変換をどうぞ。

    • 回答としてマーク kinokoNX 2012年6月8日 18:25
    2012年6月8日 14:48

すべての返信

  • 'ABC'はvarchar(3)型と認識され、nvarchar(256)型に変換されてから格納されます。
    同じように99999はint型と認識され、nvarchar(256)型に変換されてから格納されます。

    数値として認識されていることがわかりやすい例としては、 10.0、10.00、10.000 とかで試してみるといいです。

    暗黙的なデータ変換をどうぞ。

    • 回答としてマーク kinokoNX 2012年6月8日 18:25
    2012年6月8日 14:48
  • 佐祐理(MCC)様

    ご回答ありがとうございました。
    また、リンクまで貼って頂き申し訳ございません。

    さて、暗黙的なデータ変換により型変換されて格納されるとのことですが、
    マイクロソフトの解説を読む限り、特に変換によるオーバヘッドに関する記述は見当たらないので、
    少なくとも文字列型のカラムに単引用符なしで数値を入れる処理のような場合については、
    それはあまり気にしなくてもよいのでしょうか。

    以上、よろしくお願い致します。


    2012年6月8日 15:48
  • マイクロソフトの解説を読む限り、特に変換によるオーバヘッドに関する記述は見当たらないので、

    少なくとも文字列型のカラムに単引用符なしで数値を入れる処理のような場合については、

    実際にアプリケーションを開発する場合は SQL インジェクションによる不正動作を防ぐために、ユーザーが入力した値をパラメタ化します。

    2012年6月8日 18:48
  • 書かれていませんが変換にはコストがかかります。

    整数ならいいんですが、実数の場合問題になります。日本では小数点が . ですが、一部の国では , です。これはSQLにおいては区切り文字と認識されてしまい、INSERT先のカラムがずれることになります。もしくはカラム数と一致せずINSERTがエラーになります。

    galacoさんが提案されているようにパラメーター化すべきです。パラメーター化すると今度はSQL文も簡素化され、文の解析コストも下がります。

    2012年6月9日 0:09
  • galaco様、佐祐理(MCC)様

    ご回答ありがとうございます。
    下記2点、とても勉強になりました。
     ・暗黙の変換には常にオーバヘッドがある。
     ・SQLインジェクションの脆弱性がない、解析コストも下がるパラメータクエリを使用したSQL文にすること。

    以上です。

    ありがとうございました。

    2012年6月9日 13:16
  • 整数ならいいんですが、実数の場合問題になります。日本では小数点が . ですが、一部の国では , です。これはSQLにおいては区切り文字と認識されてしまい、INSERT先のカラムがずれることになります。もしくはカラム数と一致せずINSERTがエラーになります。

    文字列をどうやって作るかという話だと思いますが、それはおいといて

    SQL Server では SQL 文に Universal Separator 表記を採用しており、全ての言語において数値を表記する際の小数点の区切り文字は ドット (.) で表記します。利用言語によってドット (.) やコンマ (,) が区別されて使用されるのは、数値型で保持されたデータを文字列型に変換する際に明示的にフォーマット指定された場合と、文字列型で保持されたデータを数値型に変換する際だけです。





    2012年6月11日 3:56
  • K.Takaoka(MCC)様

    情報ありがとうございました。

    みなさまにたくさんの知識を授けて頂きとても勉強になりました。

    改めて感謝御礼申し上げます。


    2012年6月11日 15:06