Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
※本ページでは、全角文字の幅が、半角文字の丁度2倍になっていることを 仮定して書いているので、そうでない状態で見ている場合は、 表示が説明とはちょっとずれたりすることがあります。
今までは SELECT文に直接書いて試してきたが、 データベースは、普通テーブルを定義し、 大量のレコードを流しこんで使うのが普通の使い方である。
そのとき、テーブルが、たとえ文字ターミナル上であろうとも、 揃って出て欲しいものである。
さて、どのように文字端末上で表示されるか、実際に試してみよう。
mysqlクライアントコマンドは、文字端末上で、以下のようにして起動している。
shell$ mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 to server version: 5.0.7-beta-standard Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>
EUC-JP(eucjpms)ではテーブルはどう表示されるか
何でも良いのだが、例でよくある、郵便番号、町名、読み の3カラムからなる テーブルを作ってみよう。
mysql> SET NAMES eucjpms;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE `town` (
-> `post` char(7),
-> `name` varchar(40),
-> `yomi` varchar(40)
-> ) ENGINE=InnoDB DEFAULT CHARSET=eucjpms;
Query OK, 0 rows affected (0.11 sec)
mysql> SHOW COLUMNS FROM town;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| post | char(7) | YES | | NULL | |
| name | varchar(40) | YES | | NULL | |
| yomi | varchar(40) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.05 sec)
とりあえず簡単なテストを行なうだけなので、こんな感じに作ってみた。
そして、4レコードだけ入れてみた。 考えるのが面倒なので、会社の近所の住所を少しだけピックアップしたものである。
mysql> INSERT INTO town VALUES
-> ('1620824','揚場町','アゲバチョウ'),
-> ('1620848','市谷鷹匠町','イチガヤタカジョウマチ'),
-> ('1620802','改代町','カイタイチョウ'),
-> ('1600002','坂町','サカマチ');
Query OK, 4 rows affected (0.04 sec)
Records: 4 Duplicates: 0 Warnings: 0
テーブルの中味を表示してみよう。
mysql> SELECT * FROM town; +---------+------------+----------------------------+ | post | name | yomi | +---------+------------+----------------------------+ | 1620824 | 揚場町 | アゲバチョウ | | 1620848 | 市谷鷹匠町 | イチガヤタカジョウマチ | | 1620802 | 改代町 | カイタイチョウ | | 1600002 | 坂町 | サカマチ | +---------+------------+----------------------------+ 4 rows in set (0.01 sec)
最後の縦線が揃っていなくて見苦しい。
表示する場合、カラムは色々な順番で並べられることがある。 逆順にしてみるとどうなるだろうか。
mysql> SELECT yomi, name, post FROM town; +----------------------------+------------+---------+ | yomi | name | post | +----------------------------+------------+---------+ | アゲバチョウ | 揚場町 | 1620824 | | イチガヤタカジョウマチ | 市谷鷹匠町 | 1620848 | | カイタイチョウ | 改代町 | 1620802 | | サカマチ | 坂町 | 1600002 | +----------------------------+------------+---------+ 4 rows in set (0.00 sec)
ずいぶん見苦しくなってしまった。 さすがにこうなると困るね。
ここまでは、EUC-JP(eucjpms)の場合である。
UTF-8での表示はどうなるか
文字ターミナルをUTF-8に設定し、SET NAMES で utf8 を指定するだけで ちゃんとutf8で表示してくれる。このあたりは、とても便利と言えるかな。
mysql> SET NAMES utf8; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM town; +---------+-----------------+-----------------------------------------+ | post | name | yomi | +---------+-----------------+-----------------------------------------+ | 1620824 | 揚場町 | アゲバチョウ | | 1620848 | 市谷鷹匠町 | イチガヤタカジョウマチ | | 1620802 | 改代町 | カイタイチョウ | | 1600002 | 坂町 | サカマチ | +---------+-----------------+-----------------------------------------+ 4 rows in set (0.00 sec)
eucjpmsのときには、最後の半角のヨミの後の縦線だけが不揃いだったが、 今回はnameカラムの後の縦線も不揃いになってしまった。 また、全体のカラム幅も、eucjpmsのときよりずっと広くなっている。
文字数が多い個所ほど、カラムの幅が小さくなっているようである。
eucjpms、utf8 のいずれで表示しようとも、データそのものは同じなのだから、 まったく同じように表示されるのが当たり前と思うのだが、 何かの影響でこのようなズレが発生しているのであろう。
もう少し複雑なテーブルだったら、きっと見る気もしなくなると思うがどうだろうか。
テーブルの縦線の不揃いなど気にするな
mysqlコマンドでどう表示されようと気にすることは無いという意見もある。 システムを組んでしまった場合、エンドユーザにmysqlコマンドを 使わせることはほとんどなく、ちゃんとしたユーザインターフェイスを用意するので、 mysqlコマンドでテーブルの表示がどう崩れようと、 たいした問題ではないとの意見である。
それは、もっともである。
しかし、MySQLの書籍で、MySQLについてあれこれ説明するのに、 大抵の場合、mysqlコマンドを使って実行例を示している。 学習者も、実際にmysqlコマンドを使って確認することが多いだろう。 そういうことも考えると、やはり日本語表示であろうとも、 カラムはちゃんと揃って表示して欲しいではないか。
MySQLでは、日本語を利用した場合、カラムがガタガタになるのを そのまま本にして出す図太い神経の(鈍感な)著者や出版社はあるのだろうか。 とくに、国際化版では、UTF-8を使うことを推奨しているが、 そんなことをしたら、ますますテーブルの表示は崩れて行くのだが。
テーブルはきちんとしていないと嫌な人 ⇒ 繊細な人、神経質な人
テーブルは内容さえ表示されれば良い人 ⇒ 図太い人、無神経な人
ちょっと言い過ぎかな?
SHIFT-JIS(cp932)での表示はどうなるか
mysql> SET NAMES cp932; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM town; +---------+------------+---------------+ | post | name | yomi | +---------+------------+---------------+ | 1620824 | 揚場町 | アゲバチョウ | | 1620848 | 市谷鷹匠町 | イチガヤタカジョウマチ | | 1620802 | 改代町 | カイタイチョウ | | 1600002 | 坂町 | サカマチ | +---------+------------+---------------+ 4 rows in set (0.04 sec)
SHIFT-JIS(cp932)にすると、かくも奇麗に揃うのである。
ならば、他を捨てて、cp932を使うことにすれば問題は解決か?
戻る:CHARACTER_LENGTH()で文字列長を求める
フィードバック:
There is no comment.