none
Mysqlの文字コード(特に円マーク) RRS feed

  • 質問

  • utf-8の入力フォームから

    utf-8のデータベーステキストファイルを

    utf-8のデータベースにLoadしたく

    下記コードを書きましたが受け付けてくれません。(¥はわざと全角で表記しました。もちろん、実際は半角で2連続です)

    MySqlCommand cmd = new MySqlCommand("LOAD DATA INFILE 'C:¥¥Users¥¥hoge¥¥db.txt' INTO TABLE dbtable FIELDS TERMINATED BY ','", conn);

    円マーク1つだけだとデバッグ前にエラーが出ますし

    @"LOAD DATA ・・・・・・・・・・・・・・・・

    と頭に@をつけてもだめでした。

    また、テキストファイルの中身は文字列や時間にクオーテーションをつけなければなりませんか?

    解決方法をご存知の方ご連絡くださいましたら幸いです。

    よろしくお願いします。

     

    2010年6月7日 10:55

回答

すべての返信

  • '¥' でなくて '/' (スラッシュ) にしてみるとか。
    '¥' なら 4 つ連ねて 'C:¥¥¥¥Users¥¥¥¥hoge¥¥¥¥db.txt' としてみるとか。

    MySQL :: MySQL 5.1 リファレンスマニュアル :: 2.3.15 Windows 上の MySQL と Unix 上の MySQL の比較

    MySQL のバージョンは不明ですが。
    2010年6月7日 14:15
  • C#の文法的には問題ないと思いますが、どのようなエラーが出ているのでしょうか?

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年6月7日 14:20
    モデレータ
  • totojoさんご回答ありがとうございます。

    スラッシュもだめでした。書きそびれました。すいません。

    円マーク4連続ですか。。。検索してたら4連続をリプラスするとかそんなことをしている掲示板は見かけましたが

    結局だめだったとの結末になってました。

    ものはためし。やってみます。

    最後に、ご回答いただいた後に質問を追記してしまいました。ご容赦ください。

    2010年6月7日 14:22
  • trapemiyaさん返信が行き違いになってしまいました。すいません。

    次に結論です。

    MySqlCommand cmd = new MySqlCommand(@"LOAD DATA INFILE 'C:¥¥¥Users¥¥¥hoge¥¥¥db.txt' INTO TABLE dbtable FIELDS TERMINATED BY ','", conn);

    このように頭に@をつけて円マーク3つで命令を受け付けてくれました。

    何ででしょう?

    ただ、命令を受け付けてはくれたのですが文字化けが発生します。

    INTの列のみをつくり

    0

    1

    2

    3

    ・・・・・・・・・・・・・

    と1行だけのtxtファイルを読み込むと次のようなエラーがでてきました。

    "Incorrect integer value: '0\r\n1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\r\n25\r\n26\r\n27\r\n28\r\n29\r\n30\r\n31\r\n32\r\n33\r' for column 'id' at row 1"

    utf-8にしたコマンドプロンプトからやってみたら

    ' for column 'id' at row 1ect integer value: '1

    このようにエラーが出ました。

    無理なのでしょうか?

    2010年6月8日 7:08
  • 改行コードは指定しなくていいのでしょうか?

     LINES TERMINATED BY '\r\n'

    みたいなやつ。(おっと、ここにも円マークが)

    2010年6月8日 7:36
  • totojoさん記入漏れでした。すいません。

    必要です。

    ただし、そこも円マーク3つ必要です。

    また、引き続きテキストファイル文字化けの件、ご存じの方お願いいたします。

    また、円マーク3連続の理由をご存じの方いらっしゃいましたらよろしくおねがいします。

    • 編集済み 極小テック 2010年6月8日 12:40 回答がつかないかもしれないと心配になったから
    2010年6月8日 8:00
  • MySQL は触ったこともない自分が回答するのもなんですが・・・

    > と1行だけのtxtファイルを読み込むと次のようなエラーがでてきました。
    >
    > "Incorrect integer value: '0\r\n1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14

    TERMINATED BY ',' とコンマが区切り文字として指定しているのに、テキストフ
    ァイルにはコンマの区切り文字が入っておらず、結果、改行文字を含めて読み込ん
    でいって、Incorrect integer value と判定されているように見えますけど。

    ハズレでしたら失礼しました。

    2010年6月8日 12:17
  • SurferOnWwwさんご回答ありがとうございます。

    上記をごらんになっていただけましたらわかると思います。

    誤記です。

    TERMINATED BY ',' と書いてましたが

    LINES TERMINATED BY '¥¥¥r¥¥¥n'

    の誤りです。

    また、引き続きテキストファイル文字化けの件、ご存じの方お願いいたします。

    また、円マーク3連続の理由をご存じの方いらっしゃいましたらよろしくおねがいします。

     

    2010年6月8日 12:44
  • > 上記をごらんになっていただけましたらわかると思います。

    見ましたが分からなかったです。情報は正確に、間違いがないよう、よく整理して

    書いていただけると助かります。

    2010年6月8日 13:46
  • また、円マーク3連続の理由をご存じの方いらっしゃいましたらよろしくおねがいします。

    円マークが奇数個必要というのは、腑に落ちないですね。
    エスケープすることを考えると、'\' と何かのペアになるはずなのですが。

     Escaping backslash character in C# .NET MySQL-queries | AkillesBlog
     http://blog.akilles.org/2008/03/12/escaping-backslash-character-in-c-net-mysql-queries/


    TERMINATED BY ',' と書いてましたが
    LINES TERMINATED BY '¥¥¥r¥¥¥n'
    の誤りです。

    こちらは「\\」+「\r」+「\\」+「\n」なので当然奇数個になりますが。


    utf-8にしたコマンドプロンプトからやってみたら
    ' for column 'id' at row 1ect integer value: '1
    このようにエラーが出ました。

    コマンド プロンプト(MySQL のコンソールですよね?)でやってみてダメなのなら、すでに MySQL だけの世界の話になっているように思います。
    MySQL のフォーラムなり ML なりにご質問された方がよくないでしょうか?
    2010年6月9日 4:19
  • 極小テックさんに返信

    > 次に結論です。
    > MySqlCommand cmd = new MySqlCommand(@"LOAD DATA INFILE 'C:\\\Users\\\hoge\\\db.txt' INTO TABLE dbtable FIELDS TERMINATED BY ','", conn);
    > このように頭に@をつけて円マーク3つで命令を受け付けてくれました。
    > 何ででしょう?

    結論を出すのはいささか尚早なように思います。
    他のかたも書いていらっしゃいますが、\ の数が変です。
    文字列に @ を付加するならば C# における \ のエスケープは必要ありません。

    MySql においてディレクトリの区切りとして \ を記述する場合にエスケープのため2重にす
    る必要があり、行の区切りを指定するところでは特殊文字を表現しなければいけないので
    エスケープしてはいけません。
    こんな感じになるはずです。
    string commandText = @"LOAD DATA INFILE 'C:\\Users\\hoge\\db.txt' INTO TABLE dbtable FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'"
    MySqlCommand cmd = new MySqlCommand(commandText, conn);
    2010年6月9日 21:27
  • いろいろ試しにやりましたが、やはりパラメータ渡しがベストですね。

              MySqlConnection cn = new MySqlConnection("Data Source=localhost;Database=xxxx;User ID=xxxx;password=xxxx");
                // コマンドを作成
                MySqlCommand cmd =
                    new MySqlCommand("insert into sample values (@id, @name, @url, @date )", cn);
                // パラメータ設定
                cmd.Parameters.Add(
                    new MySqlParameter("id", 13));
                cmd.Parameters.Add(
                    new MySqlParameter("name", @"c:\konica"));
                cmd.Parameters.Add(
                    new MySqlParameter("url", null));
                cmd.Parameters.Add(
                    new MySqlParameter("date", DateTime.Now));

                // オープン
                cmd.Connection.Open();
                // 実行
                cmd.ExecuteNonQuery();
                // クローズ
                cmd.Connection.Close();

    urlが「c:\konica」で登録されたことを確認しました。c#2017, Mysql5.0

    2017年3月29日 2:45