「覚え間違い」を教えてください!

csvファイルをMySQLへ読み込んだら、空白のところが勝手に0に置き換わってしまいました。
置き換わったカラムの型が、全部INTだったので、
試しにVARCHARへ変え、再度、取り込み処理を実施してみたところ、
希望通りに(空白のところは空白のままで)無事データを取り込むことが出来ました。


■質問1
考えられる原因としては、DBの設定?
それとも、PHP側の書き方でしょうか?

■質問2
データ型を決める際、数字はINT、文字列はVARCHAR、ぐらいの認識しかないのですが、
今回のように、INT型のカラムを、VARCHAR型に、変えたりすると、
起こり得るリスクとしては、どのようなものが考えられでしょうか?

■質問3
DBのデータ型が、「INT」と「VARCHAR」では、PHP側の書き方も変わってくるのでしょうか?


□PHPの内容
▽まず、UTF-8形式で上書き
exec("nkf -w --overwrite data.csv");
▽接続後読み込み
$sql = "LOAD DATA LOCAL INFILE '$file' INTO TABLE `読み込むテーブルの名前` FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\' LINES TERMINATED BY '\\r\\n'";

A 回答 (2件)

>考えられる原因としては、DBの設定?


>それとも、PHP側の書き方でしょうか?

入力するcsvファイルの作成の仕方に、問題があります。

NULLで格納するには、入力ファイルの該当カラム位置に、\Nを入れておく必要があります。

例えば、次のような入力ファイルだったとします。

xxx,,yyyyy
xxxxx,100,y
xx,\N,yy

1レコード目の2番目のフィールドは値が入っていませんが、この場合の扱いは次のようになります。

列のデータ型が文字・・・長さ0の文字。すなわちnullではない。
列のデータ型が数値・・・0。すなわちnullではない。

>今回のように、INT型のカラムを、VARCHAR型に、変えたりすると、
>起こり得るリスクとしては、どのようなものが考えられでしょうか?

数値以外のデータが入る可能性がありますが、それが実害が出るかどうかは、その列がどういう意味のものか次第です。

(1)在庫数など数値演算するような列
(2)商品コード、注文番号、フラグなどの列

といったことで話は違ってきます。

参考URL:http://dev.mysql.com/doc/refman/5.1/ja/load-data …
    • good
    • 0
この回答へのお礼

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

>列のデータ型が文字・・・長さ0の文字。すなわちnullではない。
>列のデータ型が数値・・・0。すなわちnullではない。

など、説明、大変分かりやすかったです。


>実害が出るかどうかは、その列がどういう意味のものか次第
>(1)在庫数など数値演算するような列
>(2)商品コード、注文番号、フラグなどの列

こちらもありがとうございました。
言われてみれば、確かにそのとおりですね。
おかげで頭の中を整理することができましたー。

お礼日時:2011/04/17 20:07

空文字はNULLではありません



区切り記号を「;」、囲み記号を「"」として
NULL値がOKでデフォルトがNULLのINT型フィールドにデータ投入するとき
""は0ですね。どうしてもNULLを投入したいならNULLと書いてください。

たとえば・・・
"100";"1000"
"200";""
"300";"0"
"400";NULL

200と300の行はともに0です。
処理としてはエディタかなにかで""をNULLに一括変換してから
投入すればいいでしょう。
    • good
    • 0
この回答へのお礼

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

>空文字はNULLではありません
>囲み記号を「"」としてNULL値がOKでデフォルトがNULLのINT型フィールドにデータ投入するとき""は0ですね。

全然知りませんでした。
勉強になりましたー

お礼日時:2011/04/17 20:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報