我正在使用带有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 \'列太长'}
这是怎么回事?
答案 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实例进行开发。否则,您会发现您的代码在生产中有错误,而这些错误在开发中不会发生,并且会造成混乱并且难以调试。
您可能无法复制生产环境的每个方面,但是,如果可以的话,请使您的开发环境尽可能接近。
要解决此问题,请确保为列选择一种数据类型,该数据类型可以保存发送的长数据。
阅读https://dev.mysql.com/doc/refman/8.0/en/string-type-overview.html了解更多详细信息。