MySQL-5.0.27-win32 の日本語化についての質問です。日本語コードの取り扱いについて失敗しているようなので、その問題の解決法について教えてください。



MySQL を多言語環境でインストールして、以下のページを参考に MySQL.ini を変更しました。
http://y-kit.jp/saba/xp/mysqluser.htm
http://q.hatena.ne.jp/1151852296

つづいて上記のページを参考に総務省の持つ郵便番号データ(CSV)をタブ区切りテキストに変換して MySQL にデータをロードしようとするとエラーになります。
> ERROR 1406 (22001): Data too long for column 'pref' at row 1

この「県」データには漢字データ(e.g.東京都)が入っています。念のためアルファベットでデータを作って INSERT したところ、正常に動きました。

こういった場合どんな設定でミスしていると思われますか? お手数ですが宜しくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2006/11/06 15:32:47
  • 終了:2006/11/06 18:18:35

回答(2件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402006/11/06 15:37:29

ポイント35pt

Data too long(データが長すぎます)なので、あんまり日本語と関係ないような。


どんなテーブルを作ってどんなデータをどうやって入れようとしているのか、もう少し詳細にしていただけると回答が得られやすいと思います。

id:renpoo

御返答ありがとうございます。

テーブル定義は件の HP を参考にしたもので以下の通りです。

mysql> show fields from jpzipcode;

+---------+------+------+-----+---------+-------+

Field Type Null Key Default Extra

+---------+------+------+-----+---------+-------+

oldpost text YES NULL
newpost text NO
pref text YES NULL
area text YES NULL
addr text NO

+---------+------+------+-----+---------+-------+

私は DB に不慣れなのですが、text 型でフィールドを定義している以上、「東京都」程度の短い文字列でエラーを起こすのは納得が行きません。またアルファベットのデータで20文字ほどのデータをインサートしてみたところ成功しました。ですからマルチ・バイトがらみのエラーと推測しているのですが如何でしょうか?

2006/11/06 15:47:12
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402006/11/06 16:18:49

ポイント35pt

コマンドプロンプトからの実行と考えてよろしいでしょうか?

コマンドプロンプト自体の扱える文字コードは Shift_JIS のみとなっていますので文字コードの変換が必要です、SQL 実行前に

SET NAMES 'sjis';

を実行し、その後インサートしてみてはどうでしょうか?

id:renpoo

おかげさまで単独文での INSERT には成功しました。


mysql> insert into jpzipcode

-> (oldpost, newpost, pref, area, addr)

-> VALUES('154', '154-0002', '東京都', 'Setagaya', 'Simouma');

Query OK, 1 row affected (0.06 sec)

mysql> select * from jpzipcode;

+---------+----------+---------------------+----------+---------+

oldpost newpost pref area addr

+---------+----------+---------------------+----------+---------+

154 154-0002 Tokyo Setagaya Simouma
154 154-0002 Tokyo-to Metropolis Setagaya Simouma
154 154-0002 東京都 Setagaya Simouma

+---------+----------+---------------------+----------+---------+

3 rows in set (0.00 sec)


しかしファイルからのインサートには失敗します。


mysql> load data infile 'c:/13tokyo.txt'

-> into table jpzipcode;

ERROR 1406 (22001): Data too long for column 'pref' at row 1


となります。この“c:/13tokyo.txt”の内容は


> 102 102-0072 東京都 千代田区 飯田


のようなタブ区切りフォーマットです。文字コードについても念のため SJIS にコンヴァートしました(Meadow を使って)。

いろいろお手数をお掛けしてますが、どうしたら良いのでしょう?

2006/11/06 16:29:07
  • id:b-wind
    >どんなデータをどうやって入れようとしているのか
    をもう少し詳細にお願いします。
    たとえば、1レコードだけ登録しようとしても同じエラーが出ますか?
  • id:renpoo
    ひきつづきありがとうございます。
    たとえば單獨のインサート文でアルファベットだけのものは成功します。


    mysql> insert into jpzipcode
    -> (oldpost, newpost, pref, area, addr)
    -> VALUES('154', '154-0002', 'Tokyo-to Metropolis', 'Setagaya', 'Simouma');
    Query OK, 1 row affected (0.05 sec)

    mysql> select * from jpzipcode;
    +---------+----------+---------------------+----------+---------+
    | oldpost | newpost | pref | area | addr |
    +---------+----------+---------------------+----------+---------+
    | 154 | 154-0002 | Tokyo-to Metropolis | Setagaya | Simouma |
    +---------+----------+---------------------+----------+---------+
    1 rows in set (0.00 sec)


    ですが「東京都」に書き換えると、今回のエラーが発生します。


    mysql> insert into jpzipcode
    -> (oldpost, newpost, pref, area, addr)
    -> VALUES('154', '154-0002', '東京都', 'Setagaya', 'Simouma');
    ERROR 1406 (22001): Data too long for column 'pref' at row 1


    ほかに必要な情報はありますでしょうか?
  • id:b-wind
    なるほど、それは確かに妙ですね。
    データに関しては十分です。
    あとは出来れば実際の環境で
    SHOW VARIABLES LIKE 'char%';
    の実行結果があると助かります。

    参考
    http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ#content_1_40
  • id:renpoo
    お手数をおかけしております。

    mysql> show variables like 'char%';
    +--------------------------+----------------------------------------------------
    -----+
    | Variable_name | Value
    |
    +--------------------------+----------------------------------------------------
    -----+
    | character_set_client | utf8
    |
    | character_set_connection | utf8
    |
    | character_set_database | utf8
    |
    | character_set_filesystem | binary
    |
    | character_set_results | utf8
    |
    | character_set_server | utf8
    |
    | character_set_system | utf8
    |
    | character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.0\share\chars
    ets\ |

    以上です。
    このように「utf-8」になっております。このまま問題なければいいのですが、必要ならば今後「sjis」に変更するつもりです。
  • id:Iwa
    データベースの標準の文字コードはUTF8みたいですね。
    投入するデータとデータベースの文字コードは合っていないと文字化けしたり今回のエラーになったりなどの問題が起きます。
    もしクライアントとサーバー(この場合はデータベース)の文字コードが違う場合は先にも書かれているようにSET NAMES 'sjis';
    でクライアントの文字コードを宣言してサーバー側に文字コードを相互変換してもらう必要があります。
    ところで文字コードsjis(Shift-JIS)というのはあまりお勧めできませんね。
    詳しくは http://oss.timedia.co.jp/show/MySQL%C6%FC%CB%DC%B8%EC%A4%CE%CE%B9/%A5%D0%A5%C3%A5%AF%A5%B9%A5%E9%A5%C3%A5%B7%A5%E5(%5C,5C)%A4%AC%CA%B8%BB%FA%B2%BD%A4%B1%A4%B9%A4%EB あたりを。
    あとテーブル内のカラムの型が全てtext型というのも問題です。ちゃんと入れるデータに合わせて変えたほうが本来は良いです。
  • id:renpoo
    > Iwa 樣

    おかげさまでとりあえずの解決ができました。コンソール上では
    set names cp932;
    を実行して SJIS にして、ロードするデータは UTF-8 にコンヴァートしてやったら解決しました。

    このところ MySQL.ini を書き換えて「SJIS」にしていろいろ試していました。コンソールも内部も「SJIS」になるよう工夫したつもりでしたが失敗していたようです。このあと MySQL.ini を書き換えて「cp932」でできるようにしてもう一度試してみます。

    Iwa 樣、お手数ですが回答欄にポストしてください。のちほどポイントをお送りします。
  • id:renpoo
    MySQL.ini を再度書き換えて、データ・ファイルからのロードに成功しました。

    お二方ともありがとうございます。これで質問を閉めさせていただきます。Iwa 樣については別途ポイント送信いたします。

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

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません