MySQL - 数据太长?

Posted

技术标签:

【中文标题】MySQL - 数据太长?【英文标题】:MySQL - Data Too Long? 【发布时间】:2019-02-07 22:13:58 【问题描述】:

我正在使用带有 NodeJS 的 mysql2 库。我的本地机器和服务器上都有相同的代码和数据库结构。当我将照片上传到本地计算机上的“照片”表中时,它工作正常。当我使用服务器时,我收到以下错误:

错误:第 1 行的“照片”列数据太长 在 Packet.asError (/srv/project/server/node_modules/mysql2/lib/packets/packet.js:716:13) 在 Query.Command.execute (/srv/project/server/node_modules/mysql2/lib/commands/command.js:28:22) 在 Connection.handlePacket (/srv/project/server/node_modules/mysql2/lib/connection.js:502:28) 在 PacketParser.onPacket (/srv/project/server/node_modules/mysql2/lib/connection.js:81:16) 在 PacketParser.executeStart (/srv/project/server/node_modules/mysql2/lib/packet_parser.js:77:14) 在套接字。 (/srv/project/server/node_modules/mysql2/lib/connection.js:89:29) 在 Socket.emit (events.js:182:13) 在 addChunk (_stream_readable.js:283:12) 在 readableAddChunk (_stream_readable.js:264:11) 在 Socket.Readable.push (_stream_readable.js:219:10) 代码:'ER_DATA_TOO_LONG', 错误号:1406, sqlState: '22001', sqlMessage: '第 1 行的列 \'photo\' 的数据太长'

发生了什么事?

【问题讨论】:

【参考方案1】:

我想您是在尝试将照片作为 blob 上传?要解决此问题,您可以为您的照片列使用 longblob 数据类型。

如果您使用的是 VARCHAR 字段,请尝试增加长度并再次测试您的上传。

【讨论】:

你好 Dalton,我认为这不是问题,因为照片上传在我的本地机器上正常工作。只是他们不在服务器上工作。 你好 Dalton,看来你是对的。我能够使用 MEDIUMTEXT 好吧,太棒了! @VictordeFontnouvelle【参考方案2】:

您可能在您的服务器上启用了严格模式,而不是在您的本地 MySQL 实例上。

这样检查:

mysql> SELECT @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                                |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+

以上是 MySQL 5.7.8 及更高版本的默认 sql_mode。它包括严格模式。

严格模式的一个影响是,如果您将字符串值或数值存储到不足以获取该值的列中,则会出现错误。如果没有严格模式,MySQL 会插入行——但会截断值。

这是一个演示:

mysql> create table t ( v varchar(10) );

mysql> insert into t set v = 'Now is the time for all good men to come to the aid of their country';
ERROR 1406 (22001): Data too long for column 'v' at row 1

mysql> set sql_mode='';

mysql> insert into t set v = 'Now is the time for all good men to come to the aid of their country';
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'v' at row 1 |
+---------+------+----------------------------------------+

mysql> select * from t;
+------------+
| v          |
+------------+
| Now is the |
+------------+

严格模式是一个好东西。最好知道您的数据不适合,而不是被截断。

您应该使用与您最终将在生产中部署到的 MySQL 实例具有相同版本和相同 sql_mode 的本地 MySQL 实例进行开发。否则,您会发现您的代码在生产中存在开发中不会出现的错误,并且会令人困惑且难以调试。

您可能无法复制生产环境的每一个方面,但如果可以,请让您的开发环境尽可能接近。

要解决此问题,请确保为您的列选择可以保存您发送的长数据的数据类型。

VARBINARY 和 BLOB 最多可容纳 64KB MEDIUMBLOB 最多可容纳 16MB LONGBLOB 最多可容纳 4GB

阅读https://dev.mysql.com/doc/refman/8.0/en/string-type-overview.html了解更多详情。

【讨论】:

好建议,最后我用的是MEDIUMTEXT

以上是关于MySQL - 数据太长?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL提示1406-数据太长怎么改都添加不了新数据

MySQL 太长 varchar 截断/错误设置

使用来自 Mysql 的 sqoop 导入 Hive 耗时太长

数据截断:第 1 行的“logo”列数据太长

MySQL - 错误 1071 阻止更改字符集/排序规则,“指定的键太长......”

Laravel 5.4: 特殊字段太长报错