- ベストアンサー
csvファイルをMySQLへ読み込んだら、空白のところが勝手に0に置き換わる理由とリスク、データ型が変わることで影響するPHPの書き方
- csvファイルをMySQLへ読み込んだら、空白のところが勝手に0に置き換わる理由とリスク、データ型が変わることで影響するPHPの書き方について調査しました。
- データ型を決める際、数字はINT、文字列はVARCHARという認識が一般的ですが、INT型のカラムをVARCHAR型に変えるリスクとしては、データの不整合やパフォーマンスの低下が考えられます。
- DBのデータ型が「INT」と「VARCHAR」では、PHP側の書き方も変わってきます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>考えられる原因としては、DBの設定? >それとも、PHP側の書き方でしょうか? 入力するcsvファイルの作成の仕方に、問題があります。 NULLで格納するには、入力ファイルの該当カラム位置に、\Nを入れておく必要があります。 例えば、次のような入力ファイルだったとします。 xxx,,yyyyy xxxxx,100,y xx,\N,yy 1レコード目の2番目のフィールドは値が入っていませんが、この場合の扱いは次のようになります。 列のデータ型が文字・・・長さ0の文字。すなわちnullではない。 列のデータ型が数値・・・0。すなわちnullではない。 >今回のように、INT型のカラムを、VARCHAR型に、変えたりすると、 >起こり得るリスクとしては、どのようなものが考えられでしょうか? 数値以外のデータが入る可能性がありますが、それが実害が出るかどうかは、その列がどういう意味のものか次第です。 (1)在庫数など数値演算するような列 (2)商品コード、注文番号、フラグなどの列 といったことで話は違ってきます。
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
空文字はNULLではありません 区切り記号を「;」、囲み記号を「"」として NULL値がOKでデフォルトがNULLのINT型フィールドにデータ投入するとき ""は0ですね。どうしてもNULLを投入したいならNULLと書いてください。 たとえば・・・ "100";"1000" "200";"" "300";"0" "400";NULL 200と300の行はともに0です。 処理としてはエディタかなにかで""をNULLに一括変換してから 投入すればいいでしょう。
お礼
回答ありがとうございました。 >空文字はNULLではありません >囲み記号を「"」としてNULL値がOKでデフォルトがNULLのINT型フィールドにデータ投入するとき""は0ですね。 全然知りませんでした。 勉強になりましたー
お礼
回答ありがとうございました。 >列のデータ型が文字・・・長さ0の文字。すなわちnullではない。 >列のデータ型が数値・・・0。すなわちnullではない。 など、説明、大変分かりやすかったです。 >実害が出るかどうかは、その列がどういう意味のものか次第 >(1)在庫数など数値演算するような列 >(2)商品コード、注文番号、フラグなどの列 こちらもありがとうございました。 言われてみれば、確かにそのとおりですね。 おかげで頭の中を整理することができましたー。