Код ошибки 1292 - усеченное неверное значение DOUBLE - Mysql
Я не уверен, что это за ошибка!
#1292 - Truncated incorrect DOUBLE value:
У меня нет поля двойного значения или данных!
Я потратил впустую целый час, пытаясь понять это!
вот мой запрос
INSERT INTO call_managment_system.contact_numbers
(account_id, contact_number, contact_extension, main_number, created_by)
SELECT
ac.account_id,
REPLACE(REPLACE(REPLACE(REPLACE(ta.phone_number, '-', ''), ' ', ''), ')', ''),'(','') AS Phone,
IFNULL(ta.ext, '') AS extention,
'1' AS MainNumber,
'2' AS created_by
FROM
cvsnumbers AS ta
INNER JOIN accounts AS ac ON ac.company_code = ta.company_code
WHERE
LENGTH(REPLACE(REPLACE(REPLACE(REPLACE(ta.phone_number, '-', ''), ' ', ''), ')', ''),'(','') ) = 10
вот мое шоу создать таблицу для таблицы, результаты которой собираются
CREATE TABLE `contact_numbers` (
`number_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`account_id` int(10) unsigned NOT NULL DEFAULT '0',
`person_id` int(11) NOT NULL DEFAULT '0',
`contact_number` char(15) NOT NULL,
`contact_extension` char(10) NOT NULL DEFAULT '',
`contact_type` enum('Primary','Direct','Cell','Fax','Home','Reception','Office','TollFree') NOT NULL DEFAULT 'Primary',
`contact_link` enum('Account','PDM','Other') NOT NULL DEFAULT 'Account',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0 = inactive, 1=active',
`main_number` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 = main phone number',
`created_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`created_by` int(11) NOT NULL,
`modified_on` datetime DEFAULT NULL,
`modified_by` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`number_id`),
KEY `account_id` (`account_id`),
KEY `person_id` (`person_id`)
) ENGINE=InnoDB AUTO_INCREMENT=534 DEFAULT CHARSET=utf8
5 ответов
Это сообщение означает, что вы пытаетесь сравнить число и строку в WHERE
или же ON
пункт. В вашем запросе единственное потенциальное место, где это может произойти, это ON ac.company_code = ta.company_code
; либо убедитесь, что они имеют аналогичные объявления, либо используйте явное CAST
преобразовать число в строку.
Если вы выключите strict
В режиме ошибка должна превратиться в предупреждение.
Я исправил эту ошибку, поскольку в запросе была синтаксическая ошибка или некоторые нежелательные символы, но MySQL не смог ее перехватить. Я использовал and
во время обновления между несколькими полями, например
update user
set token='lamblala',
accessverion='dummy' and
key='somekey'
where user = 'myself'
Проблема в приведенном выше запросе может быть решена путем замены and
с запятой (,
)
Я столкнулся с той же проблемой. Попытка сравнить столбец varchar(100) с числовым значением 1. Приводит к ошибке 1292. Исправлено добавлением одинарных кавычек около 1 ('1').
Спасибо за объяснение выше
TL; DR
Это также может быть вызвано применением OR
Строковые столбцы / литералы.
Полная версия
Я получил то же сообщение об ошибке для простого INSERT
заявление с представлением:
insert into t1 select * from v1
хотя все исходные и целевые столбцы были типа VARCHAR
, После некоторой отладки я нашел основную причину; представление содержало этот фрагмент:
string_col1 OR '_' OR string_col2 OR '_' OR string_col3
что предположительно было результатом автоматического преобразования следующего фрагмента из Oracle:
string_col1 || '_' || string_col2 || '_' || string_col3
(||
это конкатенация строк в Oracle). Решение было использовать
concat(string_col1, '_', string_col2, '_', string_col3)
вместо.
Возможно, эта ошибка возникла в результате использования оператора не равно !=
в where
предложение со списком из нескольких or
значения, такие как
where columnName !=('A'||'B')
Это можно решить, используя
where columnName not in ('A','B')
Если у вас нет поля или данных с двойным значением, возможно, вам стоит попробовать отключить строгий режим sql.
Для этого вам нужно отредактировать файл "my.ini", расположенный в папке установки MySQL, найти строку "Установить строгий режим SQL" и изменить следующую строку:
# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
к этому, удалив "STRICT_TRANS_TABLES"
# Set the SQL mode to strict
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
После этого вам необходимо перезапустить службу MySQL, чтобы изменения вступили в силу.
Чтобы проверить изменение, откройте редактор и выполните это предложение sql:
SHOW VARIABLES LIKE 'sql_mode';
Очень важно: будьте осторожны с форматом файла после сохранения. Сохраните его как "UTF8", а не как "TFT8 с спецификацией", потому что служба не будет перезапущена.
Когда я получил эту ошибку, я считаю, что это была ошибка, однако вы должны иметь в виду, что если вы делаете отдельный запрос с оператором SELECT и тем же предложением WHERE, то вы можете получить первичные идентификаторы из этого SELECT: SELECT CONCAT(primary_id, ',')
) и вставьте их в невыполненный запрос UPDATE с условиями -> "WHERE [primary_id] IN ([список первичных идентификаторов, разделенных запятыми из оператора SELECT)", что позволяет устранить любые проблемы, вызванные исходным (сбой) предложение WHERE.
Лично для меня, когда я использовал кавычки для значений в "ГДЕ ____ В ([значения здесь])", это затронуло только 10 из 300 ожидаемых записей, что, на мой взгляд, похоже на ошибку.
Если вы использовали CHECK CONSTRAINT в таблице для длины строкового поля
например: чтобы проверить длину имени пользователя>= 8
использование:
CHECK (CHAR_LENGTH(username)>=8)
вместо того
CHECK (username>=8)
исправить ограничение проверки, если какое-либо из них имеет неправильное сравнение типов данных
В моем случае это была вставка представления (с высокой степенью вложенности, view in view), вызывающая ошибку в mysql-5.6:
CREATE TABLE tablename AS
SELECT * FROM highly_nested_viewname
;
Обходное решение, которое мы в итоге сделали, имитировало материализованное представление (которое действительно является таблицей) и периодически вставляло / обновляло его, используя хранимые процедуры.
Была эта проблема с ES6 и TypeORM при попытке пройти .where("order.id IN (:orders)", { orders })
, где orders
представляла собой строку чисел, разделенных запятыми. Когда я преобразовал в шаблонный литерал, проблема была решена.
.where(`order.id IN (${orders})`);