mysql-数据太长?

4xrmg8kj  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(284)

我将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'列的数据太长}
怎么回事?

w1e3prcc

w1e3prcc1#

您可能在服务器上启用了严格模式,而不是在本地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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+

以上是MySQL5.7.8及更高版本的默认SQLU模式。它包括严格模式。
strict模式的一个影响是,如果将字符串值或数值存储到一个不足以接受该值的列中,则会出现错误。在没有严格模式的情况下,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示例进行开发,该示例的版本和sqlu模式与您最终将在生产环境中部署到的mysql示例相同。否则,您会发现您的代码在产品中有开发中没有出现的错误,这将使您感到困惑和难以调试。
您可能无法复制生产环境的每一个方面,但如果可以,请尽可能地接近您的开发环境。
若要解决此问题,请确保为列选择一种数据类型,该类型可以保存发送给它的长数据。
varbinary和blob最多可容纳64kb
mediumblob最多可容纳16mb
longblob最多可容纳4gb
阅读https://dev.mysql.com/doc/refman/8.0/en/string-type-overview.html 更多细节。

gwo2fgha

gwo2fgha2#

我猜你是想把照片上传成一团?要解决这个问题,你需要一个 longblob 照片列的数据类型。
如果您使用的是varchar字段,请尝试增加长度并再次测试上载。

相关问题