Я создаю приложение PHP / MySQL, и у меня возникает проблема с моим запросом на создание и обновление. У меня есть 5 столбцов, для которых установлен тип FLOAT, которые также заданы как столбцы NULL. Я не планирую заполнять их до тех пор, пока в рабочем процессе не появится намного больше.
Однако мне нужно создать новые записи для этой базы данных, и мне нужно редактировать существующие записи, не касаясь этих 5 полей с плавающей точкой. Я использую OOP PHP, который использует стандартный метод save()
который проверяет, существует ли идентификатор в объекте. Если нет, он вызывает create()
, и если это так, он вызывает update()
. Обычно это работает очень хорошо.
Методы update()
и create()
предназначены для вытягивания из protected static $db_fields
атрибутов protected static $db_fields
объявленного в верхней части каждого класса, который содержит все поля, используемые в этой таблице. update()
и create()
через этот массив и соответственно INSERT INTO
или UPDATE
в SQL.
Я понимаю, что если вы используете ''
(две одиночные кавычки, пустые), SQL пропустит те запросы INSERT INTO
или UPDATE
и оставьте их как NULL. Есть даже поля формы для этих 5 значений с плавающей точкой в любом месте страницы, поэтому, конечно, при запуске методов значения будут равными ''
.
Вот почему я получаю ошибку «Data truncated»? Похоже, что я раньше не видел усеченной ошибки, и поэтому я прихожу к вам, гении. Благодарю.
''
и 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 автоматически игнорирует неизменные.
Если вы не собираетесь вставлять данные, это не должно быть в инструкции SQL.
В качестве примера скажем, что у вас есть таблица «Данные» с идентификаторами, float1, float2, float3 и float4, Float5, из которых вы будете добавлять только ID. INSERT должен выглядеть следующим образом:
INSERT INTO `Data` ( `id` ) VALUES ( 'Some-ID-Value' )
Если поплавки определены для приема NULL
они будут по умолчанию равны NULL
. То же самое относится к операторам UPDATE, вы должны указывать только поля, которые вы будете изменять.
Это не значит, что это решение, но только, возможно, пролить свет на проблему.
Если вы добавите ключевое слово IGNORE в оператор и попытаетесь вставить '' (или любую строку, не начинающуюся с числа) в столбец с плавающей точкой, MySQL будет вставлять значение 0 вместо значения по умолчанию.
INSERT IGNORE INTO a_table (float_column) VALUE ('') INSERT IGNORE INTO a_table (float_column) VALUE ('abc')
Оба будут вставлять 0, даже если значение по умолчанию равно null. Разумеется, без IGNORE оба утверждения повысят ошибку, которую вы видите.
Короче говоря, вы получаете сообщение, потому что данные, которые вы поставляете, не являются ни ожидаемым типом, ни значением по умолчанию.