Что это за ошибка? «Запрос к базе данных не выполнен: данные обрезаны для столбца« имя-столбца »в строке 1 - PullRequest
25 голосов
/ 10 ноября 2009

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

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

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

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

Поэтому я получаю сообщение об ошибке "Данные обрезаны"? Кажется иначе - я не видел усеченной ошибки раньше, и поэтому я прихожу к вам, гении. Спасибо.

Ответы [ 3 ]

32 голосов
/ 10 ноября 2009

'' и 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 голосов
/ 10 ноября 2009

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

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

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

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

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

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

1 голос
/ 10 ноября 2009

Если вы не собираетесь вставлять данные, их не должно быть в операторе SQL.

В качестве примера, скажем, у вас есть таблица «Данные» с id, float1, float2, float3 и float4, Float5, из которых вы будете добавлять только идентификатор. ВСТАВКА должна выглядеть так:

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

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

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