代码之家  ›  专栏  ›  技术社区  ›  Rogach

使用utf8的MySQL命令行表列宽

  •  2
  • Rogach  · 技术社区  · 7 年前

    为什么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 回复  |  直到 7 年前
        1
  •  3
  •   Bill Karwin    7 年前

    在mysql的源代码中。cc(源 mysql 客户端)注释栏中有功能说明 get_field_disp_length() 用于结果集输出的格式化。

    返回字段在渲染为后的长度 文本

    这不知道也不关心多字节字符。假设我们 使用这样的字符集。我们不可能知道接下来的所有行 关于一个角色。至少一行有可能包含 全部渲染为每个字符,因此最大长度为 因为我们永远不可能知道数据库的字符数 只发送字节数。2: 字符(<=字节。)

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

    UCS-2