0

我发现如果结果表字段是西里尔文(可能还有其他非拉丁文),则结果表字段比其最长的字符串值长得多。我需要得到非常紧凑的结果。

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,适用于使用 readline 6.2 的 debian-linux-gnu (x86_64)

4

1 回答 1

0

我相信这可能是因为 utf8 字符每个字符最多需要三个字节。因此,虽然第三个结果中的字符串看起来是 16 个字符 (КирилицаКирилица),但它需要 32 个字符来存储,因此框是 32 个字符宽。我会假设在这种情况下,字符串本身的字符每个都使用 2 个字节。看起来 mysql 客户端正在检查最大字段长度是否为 32 个字符(即使这会导致 16 个字符)。

您可以通过尝试存储值来测试它:

ирилицаКирилицаирилицаКирилица

这需要 64 个字符来存储,并且会被截断。

于 2013-10-21T16:26:56.150 回答