Код помилки 1292 - Зрізане неправильне значення DOUBLE - Mysql


85

Я не впевнений, що це за помилка!

#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

7
Згідно з цим звітом про помилку повідомлення походить від порівняння рядкового стовпця з цілим числом, оскільки вони обидва перетворюються на doubleдля порівняння. Як ac.company_codeі ta.company_codeдекларується?
Бармар,

Дивіться також bugs.mysql.com/bug.php?id=46641 де плакат припустив , що це повідомлення про помилку перефразувати в «WHERE порівняння між числовими і нечисловими стовпцями заборонено»
Barmar

Обидва ці стовпці - це int (11), а не рядки!
Майк,

Чи можете ви зробити sqlfiddle з деякими зразками даних?
Бармар,

Відповіді:


156

Це повідомлення означає, що ви намагаєтеся порівняти число та рядок у реченні WHEREабо ON. У вашому запиті єдиним потенційним місцем, де це може відбуватися, є ON ac.company_code = ta.company_code; або переконайтесь, що вони мають подібні декларації, або використовуйте явний CASTдля перетворення числа в рядок.

Якщо ви вимкнете strictрежим, помилка повинна перетворитися на попередження.


1
Ого, яке оманливе повідомлення про помилку. Дякуємо за допомогу. Ви були праві. Мені потрібно було переодягнутися DB::table('contacts')->where('attendance', $int) ->update(["attendance" => $string]);вDB::table('contacts')->where('attendance', '' . $int) ->update(["attendance" => $string]);
Райан

4
Дякую за це. Щоб розширити: існує всілякі способи, якими це може бути викликано. У моєму випадку він використовував регулярний вираз для вилучення цілого числа з рядка та порівняння цього з цілим числом. Дивно, коли я щойно використовував оператор SELECT, все було нормально: виберіть xxxx із t1 внутрішнього об’єднання t2 на t1.id = substr (value, locate (':', tagvalue) +1) Після того, як я перетворив це на INSERT. ..ВИБІР, помилка була спровокована.
xgretsch

22

Я виправив цю помилку, оскільки в запиті була синтаксична помилка або деякі небажані символи, але MySQL не зміг її виявити. andПід час оновлення я використовував між кількома полями, наприклад

update user 
set token='lamblala', 
    accessverion='dummy' and 
    key='somekey' 
where user = 'myself'

Проблему у наведеному вище запиті можна вирішити, замінивши andна зап’яту ( ,)


Дякую, це не велика проблема, але іноді маленька проблема стає великою
Суміт Кумар Гупта

Дуже дякую!!!! Це трапилося зі мною в контексті заяви про оновлення
KC Baltz

8

Я стикався з тим самим питанням. Спроба порівняти стовпець varchar (100) із числовим 1. Результат помилки 1292. Виправлено додаванням одинарних лапок навколо 1 ('1').

Дякую за пояснення вище


3

TL; ЛІКАР

Це також може бути спричинено застосуванням 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)

замість цього.


Дякую! Нове для MySQL, я об'єднував за допомогою дозволеного способу SQL Server, щось на зразок string1 + string2 + string3. Ваша пропозиція функції concat виправила цю помилку для мене.
Марсі

1

Коли я отримав цю помилку, я вважаю, що це була помилка, однак ви повинні мати на увазі, що якщо ви робите окремий запит із оператором SELECT і тим самим реченням WHERE, тоді ви можете захопити первинні ідентифікатори з цього оператора SELECT SELECT CONCAT(primary_id, ','):) та вставити їх у невдалий запит UPDATE з умовами -> "WHERE [primary_id] IN ([список розділених комами первинних ідентифікаторів з оператора SELECT)", що дозволяє усунути будь-які проблеми, викликані пропозицією WHERE оригінального (невдалого) запиту.

Для мене особисто, коли я використовував лапки для значень у розділі "ДЕ ____ В ([значення тут])", це впливало лише на 10 із 300 очікуваних записів, що, на мій погляд, здається помилкою.


1

Я бачив кілька випадків, коли виникає ця помилка:

1. використання оператора не дорівнює !=в whereреченні зі списком декількох orзначень

як от:

where columnName !=('A'||'B')

Це можна вирішити за допомогою

where columnName not in ('A','B')

2. відсутність оператора порівняння у if()функції:

select if(col1,col1,col2);

для того, щоб вибрати значення, col1якщо воно існує, і в іншому випадку показати значення у col2... це видає помилку; це можна вирішити за допомогою:

select if(col1!='',col1,col2);

0

У моєму випадку помилка в :

CREATE TABLE tablename AS
  SELECT * FROM highly_nested_viewname
;

Обхідним шляхом, який ми закінчили, було імітація матеріалізованого подання (яке насправді є таблицею) та періодичне вставлення / оновлення за допомогою збережених процедур.


0

Виникла ця проблема з ES6 та TypeORM під час спроби переходу .where("order.id IN (:orders)", { orders }), де ordersрядок чисел відокремлюється комами. Коли я перетворив на шаблонний літерал, проблема була вирішена.

.where(`order.id IN (${orders})`);

0

Якщо ви використовували CHECK CONSTRAINT в таблиці для довжини поля рядка

наприклад: перевірити довжину імені користувача> = 8

використання:

CHECK (CHAR_LENGTH(username)>=8)

замість

CHECK (username>=8)

виправити обмеження перевірки, якщо у них є неправильне порівняння типів даних


0

Якщо у вас немає поля подвійного значення або даних, можливо, вам слід спробувати відключити строгий режим 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 з BOM", оскільки служба не перезапуститься.


Більш безпечно робити це на основі сеансу, або навіть краще лише в конкретному скрипті, який модифікує "проблемні таблиці": $pdo->query('SET SESSION SQL_MODE = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')і після вашої магії сценарію, поверніть строго назад таким же чином:$pdo->query('SET SESSION SQL_MODE = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')
Piemol
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.