民芸的プログラミング 〜ソフトウェア開発日記〜

アクセスカウンタ

zoom RSS MySQL の文字コード設定を後から変えるテスト

<<   作成日時 : 2009/03/10 07:19   >>

なるほど(納得、参考になった、ヘー) ブログ気持玉 5 / トラックバック 0 / コメント 0

前の記事の続き。
前の記事はリアルに作業した記録だったので、どたばたした感じになってしまった。
今回、改めて色々とテストしてみた。
使ったのは Debian GNU/Linux 上の MySQL 5.0

まずテスト用のデータベースを作る。
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.03 sec)

テスト用のデータベースに接続。
mysql> connect test;
Connection id: 1051
Current database: test

警告を表示するように設定。
mysql> warnings;
Show warnings enabled.

ここで文字コードの状態を確認。
mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | latin1 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

クライアント側の文字コードはutf8ということにする。
mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)

もう一度文字コードの状態を確認。
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 | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

テスト用のテーブル作成。
mysql> CREATE TABLE test ( id INT PRIMARY KEY NOT NULL, name CHAR(4) );
Query OK, 0 rows affected (0.04 sec)

作ったテーブルの定義を確認。
mysql> SHOW CREATE TABLE test;
+-------+------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+------------------------------------------------------------------------------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`id` int(11) NOT NULL,
`name` char(4) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

テスト用のデータを挿入。まずは無難なASCII文字。
mysql> INSERT INTO test VALUES (1, "abc");
Query OK, 1 row affected (0.00 sec)

続いて日本語。
mysql> INSERT INTO test VALUES (2, "あいうえ");
Query OK, 1 row affected (0.00 sec)

カラム数を超える文字を挿入すると、警告が出る。
mysql> INSERT INTO test VALUES (3, "12345");
Query OK, 1 row affected, 1 warning (0.00 sec)

Warning (Code 1265): Data truncated for column 'name' at row 1

日本語でもやはり、カラム数を超える文字を挿入すると、警告が出る。
mysql> INSERT INTO test VALUES (4, "かきくけこ");
Query OK, 1 row affected, 1 warning (0.00 sec)

Warning (Code 1265): Data truncated for column 'name' at row 1

入力したデータを一覧表示させる。
4文字以上の文字列は4文字までで切られていることがわかる。
そして、MySQL 5.0 では、ドキュメントにある通り、CHAR(4) は文字コードに関わらず文字数で4文字ということであり、4バイトにはなっていないということも分かる。
mysql> SELECT * FROM test;
+----+--------------+
| id | name |
+----+--------------+
| 1 | abc |
| 2 | あいうえ |
| 3 | 1234 |
| 4 | かきくけ |
+----+--------------+
4 rows in set (0.00 sec)

ここからがメインのテスト。おもむろに、カラムの文字コードを latin1 に変換してやる。さすがに警告が出る。
mysql> ALTER TABLE test MODIFY name char(4) CHARACTER SET latin1;
Query OK, 4 rows affected, 2 warnings (0.07 sec)
Records: 4 Duplicates: 0 Warnings: 0

Warning (Code 1366): Incorrect string value: '\xE3\x81\x82\xE3\x81\x84...' for column 'name' at row 2
Warning (Code 1366): Incorrect string value: '\xE3\x81\x8B\xE3\x81\x8D...' for column 'name' at row 4

ここでテーブルの定義を確認する。name というカラムの character set が latin1 になっている。
mysql> SHOW CREATE TABLE test;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`id` int(11) NOT NULL,
`name` char(4) character set latin1 default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

データを表示させる。日本語だった部分が化け化け。
mysql> SELECT * FROM test;
+----+------+
| id | name |
+----+------+
| 1 | abc |
| 2 | ???? |
| 3 | 1234 |
| 4 | ???? |
+----+------+
4 rows in set (0.00 sec)

クライアント側の文字コードを latin1 ということにする。
mysql> SET NAMES latin1;
Query OK, 0 rows affected (0.00 sec)

この状態でデータを表示させるが、やはり日本語の部分は化けたまま。
mysql> SELECT * FROM test;
+----+------+
| id | name |
+----+------+
| 1 | abc |
| 2 | ???? |
| 3 | 1234 |
| 4 | ???? |
+----+------+
4 rows in set (0.00 sec)

カラムの文字コードを utf8 に戻してやる。
mysql> ALTER TABLE test MODIFY name char(4) CHARACTER SET utf8;
Query OK, 4 rows affected (0.08 sec)
Records: 4 Duplicates: 0 Warnings: 0

データを表示させようとすると、日本語部分は化けたまま。
mysql> SELECT * FROM test;
+----+------+
| id | name |
+----+------+
| 1 | abc |
| 2 | ???? |
| 3 | 1234 |
| 4 | ???? |
+----+------+
4 rows in set (0.00 sec)

クライアントの文字コードも utf8 に戻す。
mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)

しかしやはり、日本語だった部分は化けたまま。
mysql> SELECT * FROM test;
+----+------+
| id | name |
+----+------+
| 1 | abc |
| 2 | ???? |
| 3 | 1234 |
| 4 | ???? |
+----+------+
4 rows in set (0.00 sec)

データを挿入した後で、カラムの文字コードを変換するのは、無理があるようだ。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 5
なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー)
ナイス

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
MySQL の文字コード設定を後から変えるテスト 民芸的プログラミング 〜ソフトウェア開発日記〜/BIGLOBEウェブリブログ
文字サイズ:       閉じる