MySQL 控制台。 Linux。结果字段长度比最长的西里尔字符串长两倍

标签 mysql

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

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/

相关文章:

MYSQL less Than函数不能正常工作

mysql - 查询有问题

php - 如何修复php中 undefined variable

php - 日期格式转换在 Kohana 查询生成器中返回 "null"

java - 如何从MySQL数据库中获取特定数据?

php - 在另一个 php 文件中选择同一个表

mysql - 使用子查询加速 JOIN

MySQL : Applying index to benifit query with 4 user controlled conditions in a where clause

c++ - 每次执行查询时程序都会挂起

mysql - 使用sql查找表之间不匹配的行