MySQL - данные слишком длинные? - PullRequest
0 голосов
/ 02 сентября 2018

Я использую библиотеку mysql2 с NodeJS. У меня такой же код и структура базы данных на моей локальной машине, как и на сервере. Когда я загружаю фотографию в таблицу «photos» на моей локальной машине, она работает нормально. Когда я использую сервер, я получаю следующую ошибку:

{Ошибка: данные слишком длинные для столбца 'photo' в строке 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) at readableAddChunk (_stream_readable.js: 264: 11) в Socket.Readable.push (_stream_readable.js: 219: 10) код: 'ER_DATA_TOO_LONG', ошибка: 1406, sqlState: '22001', sqlMessage: 'Данные слишком длинные для столбца \' фото \ 'в строке 1'}

Что происходит?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Возможно, на вашем сервере включен строгий режим, а не локальный экземпляр 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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+

Выше приведено значение sql_mode по умолчанию для MySQL 5.7.8 и более поздних версий. Включает строгий режим.

Одним из эффектов строгого режима является то, что если вы сохраняете строковое или числовое значение в столбце, который недостаточно велик, чтобы принять это значение, вы получите ошибку. Без строгого режима 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 вмещают до 64 КБ
  • MEDIUMBLOB вмещает до 16 МБ
  • LONGBLOB вмещает до 4 ГБ

Читайте https://dev.mysql.com/doc/refman/8.0/en/string-type-overview.html для более подробной информации.

0 голосов
/ 02 сентября 2018

Полагаю, вы пытаетесь загрузить фотографии в виде блоба? Чтобы исправить это, вы используете тип данных longblob для столбца фотографий.

Если вы используете поле VARCHAR, попробуйте увеличить длину и снова протестируйте загрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...