我发现结果表字段如果是西里尔语(可能还有其他非拉丁语),则比其最长的字符串值长得多。我需要获得非常紧凑的结果。
mysql> select * from tmp7 limit 1;
+-------+
| dir |
+-------+
| latin |
+-------+
1 row in set (0.00 sec)
mysql> select * from tmp7 limit 2;
+------------------+
| dir |
+------------------+
| latin |
| Кирилица |
+------------------+
2 rows in set (0.00 sec)
mysql> select * from tmp7;
+----------------------------------+
| dir |
+----------------------------------+
| latin |
| Кирилица |
| КирилицаКирилица |
+----------------------------------+
3 rows in set (0.00 sec)
mysql> show create table tmp7;
+-------+---------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------+
| tmp7 | CREATE TABLE `tmp7` (
`dir` varchar(60) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
这是 MySQL 的错误吗?有什么解决办法吗?
mysql Ver 14.14 Distrib 5.5.32, for debian-linux-gnu (x86_64) using readline 6.2
最佳答案
我相信这可能是因为 utf8 字符每个字符最多需要三个字节。因此,虽然第三个结果中的字符串看起来有 16 个字符 (КирилицаКирилица),但它需要存储 32 个字符,因此该框的宽度为 32 个字符。我假设在这种情况下,字符串中的字符本身每个使用 2 个字节。看起来 mysql 客户端正在检查最大字段长度是否为 32 个字符(即使这会导致 16 个字符)。
您可以通过尝试存储值来测试这一点:
ирилицаКирилицаирилицаКирилица
这需要 64 个字符来存储,并且会被截断。
关于MySQL 控制台。 Linux。结果字段长度比最长的西里尔字符串长两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19499448/