2017-09-09 6 views
1

なぜmysqlコマンドラインはutf8カラムを非utfカラムの2倍の幅で出力するのですか?例:utf8でのMySQLコマンドラインテーブルのカラム幅

$ mysql -u user --default-character-set=utf8 
mysql> select "αβγαβγαβγαβγαβγαβγαβγ"; 
+--------------------------------------------+ 
| αβγαβγαβγαβγαβγαβγαβγ      | 
+--------------------------------------------+ 
| αβγαβγαβγαβγαβγαβγαβγ      | 
+--------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> select "abcabcabcabcabcabcabc"; 
+-----------------------+ 
| abcabcabcabcabcabcabc | 
+-----------------------+ 
| abcabcabcabcabcabcabc | 
+-----------------------+ 
1 row in set (0.00 sec) 

あなたが見ることができるように、最初のテーブルには列が2倍の幅二のテーブルと比較している、とのラインが半画面ワイド以上のものを得るために起動したときに、これは多くの場合、書式設定壊れます。

私はこれをMySQL 14.14とMariaDB 15.1で試しました。

utf8以外の列と同じ幅のutf8列を出力する方法はありますか?

編集:結果のフォーマッティングに使用される関数get_field_disp_length()コメントブロックの説明があるmysql.cc(mysqlクライアントのソース)のソースコードで

MariaDB [(none)]> 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/ | 
+--------------------------+----------------------------+ 
+0

'SHOW VARIABLES LIKE 'char%';' - 何かが間違っていると思われます。ギリシャ文字はutf8で2バイトとなります。 –

+0

@RickJames - そのコマンドの出力を質問に追加しました。ほとんどの非latin1文字はutf8で2バイトを取ることは知っていますが、列表示幅を計算するときにmysqlが文字カウントの代わりにバイト数を使用するのはなぜですか? – Rogach

答えて

2

出力を設定します。

フィールドの長さを テキストにレンダリングした後に返します。

これは、マルチバイト文字を認識しない、または気にしません。このような文字セットを使用していると仮定します。 この列の今後の行 にはそれぞれ、ある文字の一部分がレンダリングされることがわかりません。 少なくとも行にはそれぞれ が1文字ずつレンダリングするバイトがあるため、最大長は で、まだバイト数です。 (仮定1:我々はDBが を送信しようとしている文字の数を知ることはできませんので、これは 良くすることはできません - バイト数のみを2:文字数< =バイト)

つまり、UTF8 に1文字あたり1バイト(ラテン文字のような)の文字を格納することができ、その結果が表示される前にデータが何であるかを知ることができないため、 1文字につき1バイト。

UCS-2のように、文字あたり2バイトの定数を使用するキャラクタセットを使用すると、ストーリーが異なる場合があります。しかし、MySQLは可変長Unicodeエンコーディングをサポートしているので、UCS-2を使っている人は誰も聞いたことがありません。