Подтвердить что ты не робот

Что это за ошибка? "Ошибка базы данных: данные усечены для столбца" column_name "в строке 1

Я создаю приложение PHP/MySQL, и у меня возникает проблема с моим запросом на создание и обновление. У меня есть 5 столбцов, для которых установлен тип FLOAT, которые также заданы как столбцы NULL. Я не планирую заполнять их до тех пор, пока в рабочем процессе не появится намного больше.

Однако мне нужно создать новые записи для этой базы данных, и мне нужно отредактировать существующие записи, не касаясь этих 5 полей float. Я использую OOP PHP, который использует стандартный метод save(), который проверяет, существует ли идентификатор в объекте. Если нет, он вызывает create(), и если это так, он вызывает update(). Он работает очень хорошо, обычно.

Методы update() и create() предназначены для вытягивания из массива атрибутов protected static $db_fields, объявленного в верхней части каждого класса, который содержит все поля, используемые в этой таблице. update() и create() проходят через этот массив и соответственно INSERT INTO или UPDATE в SQL.

Я понимаю, что если вы используете '' (две одинарные кавычки, пустые), SQL пропустит те запросы INSERT INTO или UPDATE и оставьте их как NULL. Есть даже поля формы для этих 5 значений с плавающей точкой в ​​любом месте страницы, поэтому, конечно, при запуске методов значения будут ''.

Вот почему я получаю сообщение "Data truncated"? Кажется совсем другим - я до сих пор не видел усеченной ошибки и почему я прихожу к вам, гениям. Спасибо.

4b9b3361

Ответ 1

'' и null не совпадают. если ваш сервер mysql находится в строгом режиме, тогда он откажется делать вставку, поскольку вы передали недопустимые данные для столбца. без строгого режима он возвращает предупреждение.

mysql> create table a (a float not null);
Query OK, 0 rows affected (0.11 sec)

mysql> insert a values ('');
Query OK, 1 row affected, 1 warning (0.05 sec)

mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'a' at row 1 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)

mysql> set sql_mode = 'STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.02 sec)

mysql> insert a values ('');
ERROR 1265 (01000): Data truncated for column 'a' at row 1

либо вставить явный null s, либо даже не указать столбец во вставке.

при обновлении вы можете отправить все значения, которые у вас есть, поскольку mysql автоматически игнорирует неизменные.

Ответ 2

Если вы не собираетесь вставлять данные, это не должно быть в инструкции SQL.

В качестве примера скажем, что у вас есть таблица "Данные" с идентификаторами, float1, float2, float3 и float4, Float5, из которых вы будете добавлять только ID. INSERT должен выглядеть следующим образом:

INSERT INTO `Data` ( `id` )
VALUES ( 'Some-ID-Value' )

Если поплавки определены для принятия NULL, по умолчанию они будут NULL. То же самое относится к операторам UPDATE, вы должны только перечислять поля, которые вы будете изменять.

Ответ 3

Это не значит, что это решение, но только для того, чтобы, возможно, пролить свет на проблему.

Если вы добавите ключевое слово IGNORE в оператор и попытаетесь вставить '' (или любую строку, не начинающуюся с числа) в столбец с плавающей точкой, MySQL будет вставлять значение 0 вместо значения по умолчанию.

INSERT IGNORE INTO a_table (float_column) VALUE ('')

INSERT IGNORE INTO a_table (float_column) VALUE ('abc')

Оба будут вставлять 0, даже если значение по умолчанию равно null. Разумеется, без IGNORE оба утверждения повысят ошибку, которую вы видите.

Короче говоря, вы получаете сообщение, потому что данные, которые вы поставляете, не являются ожидаемым типом и значением по умолчанию.