为什么 mysql 命令行输出 utf8 列的宽度是非 utf 列的两倍?示例:
Why mysql command-line outputs utf8 columns twice as wide compared to non-utf columns? Example:
$ 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)
如您所见,第一个表格的列宽是第二个表格的两倍,当行开始超过半个屏幕时,这通常会破坏格式.
As you can see, first table has column twice as wide compared to second table, and this often breaks formatting when lines start to get more than half-screen wide.
我在 MySQL 14.14 和 MariaDB 15.1 上试过这个.
I tried this on MySQL 14.14 and MariaDB 15.1.
有没有办法输出与非utf宽度相同的utf8列?
Is there a way to output utf8 columns with the same width as non-utf?
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/ |
+--------------------------+----------------------------+
mysql.cc 的源代码(mysql 客户端的源代码)的注释块中有对函数的解释get_field_disp_length() 用于结果集输出的格式化.
In the source code for mysql.cc (the source for the mysql client) there is an explanation in the comment block for function get_field_disp_length() which is used in the formatting of result set output.
返回一个字段被渲染后的长度文本.
Return the length of a field after it would be rendered into text.
这不知道也不关心多字节字符.假设我们是使用这样的字符集.我们无法知道所有即将到来的行对于此列将有字节,每个字节都呈现为某个分数的一个字符.至少有可能一行的字节数全部渲染为一个字符,因此最大长度为仍然是字节数.(假设 1:这再好不过了因为我们永远无法知道 DB 的字符数将要发送——只有字节数.2:字符 <= 字节.)
This doesn't know or care about multibyte characters. Assume we're using such a charset. We can't know that all of the upcoming rows for this column will have bytes that each render into some fraction of a character. It's at least possible that a row has bytes that all render into one character each, and so the maximum length is still the number of bytes. (Assumption 1: This can't be better because we can never know the number of characters that the DB is going to send -- only the number of bytes. 2: Chars <= Bytes.)
换句话说,由于UTF8可以存储每个字符1个字节的字符(如拉丁字符),结果在获取数据之前无法知道数据是什么,它必须假设任何或所有字符可能是每个字符一个字节.
In other words, since UTF8 can store characters that are 1 byte per character (like Latin characters), and the result can't know what the data is before it fetches it to display, it must assume any or all characters may be one byte per character.
如果您使用的字符集每个字符使用常量 2 个字节,则情况可能会有所不同,例如 UCS-2.但我从未听说有人使用 UCS-2,因为 MySQL 支持可变长度的 Unicode 编码.
The story might be different if you used a character set that uses a constant 2 bytes per character, like UCS-2. But I have never heard of anyone using UCS-2, since MySQL supports variable-length Unicode encodings.
这篇关于MySQL命令行表列宽与utf8的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
我应该使用什么 SQL Server 数据类型来存储字节 What SQL Server Datatype Should I Use To Store A Byte[](我应该使用什么 SQL Server 数据类型来存储字节 [])
解释 SQL Server 中 sys.objects 中的类型代码Interpreting type codes in sys.objects in SQL Server(解释 SQL Server 中 sys.objects 中的类型代码)
Typeorm 不返回所有数据Typeorm Does not return all data(Typeorm 不返回所有数据)
Typeorm .loadRelationCountAndMap 返回零Typeorm .loadRelationCountAndMap returns zeros(Typeorm .loadRelationCountAndMap 返回零)
将多个子查询转换为 on joinConvert multiple sub-queries to on join(将多个子查询转换为 on join)
如何获得 T SQL 中 2 次之间的微小差异?How do I get the minute difference between 2 times in T SQL?(如何获得 T SQL 中 2 次之间的微小差异?)