MySQL-数据太长?

时间:2018-09-02 18:15:17

标签: mysql node.js npm

我正在使用带有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_visible.js:283:12)     在可读AddChunk(_stream_visible.js:264:11)     在Socket.Readable.push(_stream_visible.js:219:10)   代码:“ ER_DATA_TOO_LONG”,   errno:1406,   sqlState:“ 22001”,   sqlMessage:'数据在第1行的'photo \'列太长'}

这是怎么回事?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您可能已在服务器上启用了严格模式,而不在本地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了解更多详细信息。