MySQL命令行表的列宽为utf8

时间:2017-09-09 07:37:51

标签: mysql utf-8

为什么mysql命令行输出utf8列的宽度是非utf列的两倍?例如:

$ 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)

正如您所看到的,第一个表的列宽度是第二个表的两倍,当行开始超过半屏宽时,这通常会破坏格式化。

我在MySQL 14.14和MariaDB 15.1上试过这个。

有没有办法输出与非utf相同宽度的utf8列?

编辑:

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/ |
+--------------------------+----------------------------+

1 个答案:

答案 0 :(得分:2)

在mysql.cc的源代码(mysql客户端的源代码)中,函数get_field_disp_length()的注释块中有一个解释,用于格式化结果集输出。 / p>

  

返回字段后的字段长度   文本。

     

这并不了解或关心多字节字符。假设我们是   使用这样的charset。我们无法知道所有即将到来的行   对于此列,将具有每个呈现为某个分数的字节   一个角色。至少可能一行有字节   所有渲染成一个字符,所以最大长度是   仍然是字节数。 (假设1:这可能会更好   因为我们永远不会知道数据库的字符数   要发送 - 只有字节数。 2:Chars< = Bytes。)

换句话说,因为UTF8 可以存储每个字符1个字节的字符(如拉丁字符),结果在获取数据之前无法知道数据是什么,它必须假设任何或所有字符可能是每个字符一个字节。

如果使用的字符集每个字符使用一个常量2个字节,例如UCS-2,则故事可能会有所不同。但我从来没有听说有人使用UCS-2,因为MySQL支持可变长度的Unicode编码。