Open Source WEB

タイトル部分が揃わない

半角カタカナの文字列だけを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のプログラムをいじるのはこのあたりでストップすることにしよう。 あまりプログラムをいじり過ぎると、ちっとも先へ旅ができない。

ということで、余分な空白を除くようにプログラムを改変するのは 皆さんで試みてください。 要するに、読者の皆さんへの宿題ということ。 はやい話が、面倒臭いから宿題にしてしまうことで、終わろう。

うまくできたら、ぜひご連絡ください。 期待して待ってま〜す。


戻る:フィールド毎にキャラクタセットを反映できた

次へ:5.1でmysqlのプロトコル変更により解決か


フィードバック:

Name:
Comment:

There is no comment.

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us