AWS RDS: SQLSTATE[22001] – Data too long for column в MariaDB 10.2

Автор: | 08/08/2019
 

Имеется PHP-приложение с бекендом AWS RDS MariaDB.

На версии 10.0 работало нормально, но после миграции на 10.2 – в логах начали появляться ошибки:

PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column ‘name’ at row 1 in /data/projects/projectname/vendor/yiisoft/yii2/db/Command.php:1290

Вариант первый – это просто сменить тип колонки с VARCHAR на LONGTEXT, например так:

[simterm]

MariaDB [dbname]> ALTER TABLE table_name MODIFY column_name LONGTEXT;

[/simterm]

Но в данном случае это костыль.

Решение

Проверяем значение sql_mode на старом сервере, с 10.0:

[simterm]

MariaDB [(none)]> select @@sql_mode;
+------------+
| @@sql_mode |
+------------+
|            |
+------------+

[/simterm]

И на новом, с 10.2:

[simterm]

MariaDB [dbname]> select @@sql_mode;
+-------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                |
+-------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------+

[/simterm]

И Parameters groups, которая подключена к данному RDS:

Нас тут интересует STRICT_TRANS_TABLES:

If a value could not be inserted as given into a transactional table, abort the statement.

Задаём значения NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION, что бы перезаписать дефолтное значение “STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION“:

Переподключаемся к консоли, проверяем ещё раз:

[simterm]

MariaDB [(none)]> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+

[/simterm]

Готово.