我将mysql2库与nodejs一起使用。我在本地机器上有相同的代码和数据库结构,还有一个服务器。当我上传一张照片到“照片”表,在我的本地机器上,它工作正常。使用服务器时,出现以下错误:
{错误:对于packet.aserror(/srv/project/server/node\u modules/mysql2/lib/packets/packet.js:716:13)at query.command.execute(/srv/project/server/node\u modules/mysql2/lib/commands/command.js:28:22)at connection.handlepacket(/srv/project/server/node\u modules/mysql2/lib/connection.js:502:28)at connection.handlepacket.asert(/project/server/node\u modules/mysql2packetparser.onpacket(/srv/project/server/node\u modules/mysql2/lib/connection.js:81:16)位于socket的packetparser.executestart(/srv/project/server/node\u modules/mysql2/lib/packet\u parser.js:77:14)(/srv/project/server/node\u modules/mysql2/lib/connection.js:89:29)在socket.emit(events.js:182:13)在addchunk(\u stream\u readable.js:283:12)在readableaddchunk(\u stream\u readable.js:264:11)在socket.readable.push(\u stream\u readable.js:219:10)代码:“er\u data\u too\u long”,errno:1406,sqlstate:“22001”,sqlmessage:'第1行'photo'列的数据太长}
怎么回事?
2条答案
按热度按时间w1e3prcc1#
您可能在服务器上启用了严格模式,而不是在本地mysql示例上。
这样检查:
以上是MySQL5.7.8及更高版本的默认SQLU模式。它包括严格模式。
strict模式的一个影响是,如果将字符串值或数值存储到一个不足以接受该值的列中,则会出现错误。在没有严格模式的情况下,mysql会插入行,但会截断值。
下面是一个演示:
严格模式是一件好事。最好知道您的数据不适合,而不是让它被截断。
您应该使用一个本地mysql示例进行开发,该示例的版本和sqlu模式与您最终将在生产环境中部署到的mysql示例相同。否则,您会发现您的代码在产品中有开发中没有出现的错误,这将使您感到困惑和难以调试。
您可能无法复制生产环境的每一个方面,但如果可以,请尽可能地接近您的开发环境。
若要解决此问题,请确保为列选择一种数据类型,该类型可以保存发送给它的长数据。
varbinary和blob最多可容纳64kb
mediumblob最多可容纳16mb
longblob最多可容纳4gb
阅读https://dev.mysql.com/doc/refman/8.0/en/string-type-overview.html 更多细节。
gwo2fgha2#
我猜你是想把照片上传成一团?要解决这个问题,你需要一个
longblob
照片列的数据类型。如果您使用的是varchar字段,请尝试增加长度并再次测试上载。