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
関連リンク
タイトル部分が揃わない
半角カタカナの文字列だけをSELECTしたら、以下のようになった。
mysql> SELECT 'サカマチ'; +----------+ | サカマチ | +----------+ | サカマチ | +----------+ 1 row in set (0.06 sec) mysql>
タイトルの方が揃わないのは、ちょっとみっともない。
今回は、これも揃えてしまおうと思う。
タイトル部分、つまりコラム名を並べているのは、以下の部分らしい。
2200 if (column_names)
2201 {
2202 mysql_field_seek(result,0);
2203 (void) tee_fputs("|", PAGER);
2204 for (uint off=0; (field = mysql_fetch_field(result)) ; off++)
2205 {
2206 tee_fprintf(PAGER, " %-*s|",(int) min(field->max_length,
2207 MAX_COLUMN_LENGTH),
2208 field->name);
2209 num_flag[off]= IS_NUM(field->type);
2210 }
2211 (void) tee_fputs("\n", PAGER);
2212 tee_puts((char*) separator.ptr(), PAGER);
2213 }
2206行の関数tee_fprintf()がカラムの幅を調整しながら カラム名を出力している場所に違いなく、やり方は同じようである。
この部分を、まったく同じ考えに基づいて、以下のように変更してみた。
2200 if (column_names)
2201 {
2202 mysql_field_seek(result,0);
2203 (void) tee_fputs("|", PAGER);
2204 for (uint off=0; (field = mysql_fetch_field(result)) ; off++)
2205 {
2206 const char* charsn = get_charset_name(field->charsetnr);
2207 CHARSET_INFO *charset_info= get_charset_by_name(charsn, MYF(MY_WME));
2208 uint currlength = strlength(field->name);
2209 uint numcells = charset_info->cset->numcells(charset_info,
2210 field->name, field->name+currlength);
2211
2212 tee_fprintf(PAGER, " %-*s|",(int) min(field->max_length, MAX_COLUMN_LENGTH)
2213 + currlength - numcells ,field->name);
2214 num_flag[off]= IS_NUM(field->type);
2215 }
2216 (void) tee_fputs("\n", PAGER);
2217 tee_puts((char*) separator.ptr(), PAGER);
2218 }
これで、makeし、インストールしてみよう。
動作確認
mysqlサーバは既に動いているものとして話をする。
shell$ mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 to server version: 5.0.10-beta-debug-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> SET NAMES eucjpms; Query OK, 0 rows affected (0.00 sec) mysql> SELECT 'サカマチ'; +----------+ | サカマチ | +----------+ | サカマチ | +----------+ 1 row in set (0.00 sec) mysql>
タイトルの方も大丈夫のようだ。
mysql> SELECT HEX('サカマチ');
+------------------+
| HEX('サカマチ') |
+------------------+
| 8EBB8EB68ECF8EC1 |
+------------------+
1 row in set (0.03 sec)
mysql> SELECT CONVERT(UNHEX(HEX('サカマチ')) USING eucjpms);
+-----------------------------------------------+
| CONVERT(UNHEX(HEX('サカマチ')) USING eucjpms) |
+-----------------------------------------------+
| サカマチ |
+-----------------------------------------------+
1 row in set (0.02 sec)
mysql>
UTF-8でも確認しておこう。
mysql> SET NAMES utf8; Query OK, 0 rows affected (0.01 sec) mysql> SELECT 'サカマチ'; +--------------+ | サカマチ | +--------------+ | サカマチ | +--------------+ 1 row in set (0.00 sec) mysql>
テーブルを読み出しても大丈夫のようだ。
mysql> SELECT * from town; +---------+-----------------+-----------------------------------------+ | post | name | yomi | +---------+-----------------+-----------------------------------------+ | 1620824 | 揚場町 | アゲバチョウ | | 1620848 | 市谷鷹匠町 | イチガヤタカジョウマチ | | 1620802 | 改代町 | カイタイチョウ | | 1600002 | 坂町 | サカマチ | +---------+-----------------+-----------------------------------------+ 4 rows in set (0.00 sec) mysql>
余分な空白の調整
縦線は揃うようになったみたいだ。
後は、余白がずいぶん余分に確保されてしまうことである。 各カラムの中で一番短く表示できるものに合わせて 表示幅の最大値を求めるようにプログラムを変更すれば、 もっと奇麗な表示になるだろう。
つまり、
mysql> SELECT * from town; +---------+------------+---------------+ | post | name | yomi | +---------+------------+---------------+ | 1620824 | 揚場町 | アゲバチョウ | | 1620848 | 市谷鷹匠町 | イチガヤタカジョウマチ | | 1620802 | 改代町 | カイタイチョウ | | 1600002 | 坂町 | サカマチ | +---------+------------+---------------+ 4 rows in set (0.00 sec) mysql>
という具合に表示されれば完璧と言えるのではないだろうか。
MySQLはオープンソースで、ソースプログラムは公開されている。 だから、こんなことをしてプログラムを変更していくことが、 誰だって可能である。まあ、少しはプログラムの知識は必要かも知れないが。
しかし、Cのプログラムをいじるのはこのあたりでストップすることにしよう。 あまりプログラムをいじり過ぎると、ちっとも先へ旅ができない。
ということで、余分な空白を除くようにプログラムを改変するのは 皆さんで試みてください。 要するに、読者の皆さんへの宿題ということ。 はやい話が、面倒臭いから宿題にしてしまうことで、終わろう。
うまくできたら、ぜひご連絡ください。 期待して待ってま〜す。
フィードバック:
There is no comment.