Код ошибки 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})`);
Другие вопросы по тегам