为什么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/ |
+--------------------------+----------------------------+
答案 0 :(得分:2)
在mysql.cc的源代码(mysql
客户端的源代码)中,函数get_field_disp_length()
的注释块中有一个解释,用于格式化结果集输出。 / p>
返回字段后的字段长度 文本。
这并不了解或关心多字节字符。假设我们是 使用这样的charset。我们无法知道所有即将到来的行 对于此列,将具有每个呈现为某个分数的字节 一个角色。至少可能一行有字节 所有渲染成一个字符,所以最大长度是 仍然是字节数。 (假设1:这可能会更好 因为我们永远不会知道数据库的字符数 要发送 - 只有字节数。 2:Chars< = Bytes。)
换句话说,因为UTF8 可以存储每个字符1个字节的字符(如拉丁字符),结果在获取数据之前无法知道数据是什么,它必须假设任何或所有字符可能是每个字符一个字节。
如果使用的字符集每个字符使用一个常量2个字节,例如UCS-2,则故事可能会有所不同。但我从来没有听说有人使用UCS-2,因为MySQL支持可变长度的Unicode编码。