Незаконне поєднання помилок MySQL Помилка


124

Я отримую цю дивну помилку під час обробки великої кількості даних ...

Error Number: 1267

Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

SELECT COUNT(*) as num from keywords WHERE campaignId='12' AND LCASE(keyword)='hello again 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'

Що я можу зробити, щоб вирішити це? Чи можу я якось уникнути рядка, щоб ця помилка не сталася, чи мені потрібно якось змінити кодування таблиці, і якщо так, то на що я повинен її змінити?


ця помилка, це ін'єкційна чи ні?
hamza irizaj

1
Чи відповідає це на ваше запитання? Незаконне поєднання помилок порівнянь у MySql
Farhan

Відповіді:


288
SET collation_connection = 'utf8_general_ci';

то для ваших баз даних

ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci;

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

MySQL підкрадається шведським часом туди без розумних причин.


3
@Ben: Дякую за рішення, яке безпосередньо копіюється. Економив мені багато часу.
Пістос

15
@Ben: Спочатку вона була розроблена шведською компанією ... Це причина прикрої початкової настройки Latin1_swedish_ci .. :(
Vajk Hermecz,

1
Я не мав дозволу на перше твердження, але це працювало просто за столом
Роб Седвік

Люблю тебе за це! : P
prateekkathal

Схоже, це працює для багатьох людей, але, на жаль, я все ще маю цю проблему навіть після спробу всіх пристроїв у цій темі. Моє зібрання за замовчуванням у базі даних вперто відмовляється змінити "ucs2_bin", тому навіть спробував змінити всі таблиці та порівняння на "usc2_bin", але я все одно отримую помилку "Помилка SQL (1267): Незаконне поєднання порівнянь (utf8_general_ci, IMPLICIT) та (ucs2_bin, IMPLICIT) для операції '=' ".
bikeman868

15

Ви повинні встановити кодування таблиці та кодування з'єднання таким чином UTF-8:

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

і

SET NAMES 'UTF8';
SET CHARACTER SET 'UTF8';

Чи потрібні вони обоє, чи я можу просто зробити одне з них?
Клацніть Upvote

ALTER DATABASE myDbDEFAULT CHARACTER SET utf8 COLLATE utf8_bin. Це би спрацювало? Це зроблено для того, щоб це вплинуло на всі мої таблиці, не лише одну
натисніть Upvote

1
ALTER DATABASE не змінить ваші поточні налаштування таблиці, лише новостворені. Це не завадить також змінити типову діаграму для бази даних.
Quassnoi

SET NAMES і SET CHARACTER SET змінить кодування вашого з'єднання. Ці команди потрібно видавати щоразу, коли ви підключаєтесь. Ваша клієнтська бібліотека може підтримувати більш елегантний метод зробити це (php :: mysqli робить, php :: mysql не робить).
Quassnoi

Здається, зараз працює, я прийму після ще одного тестування. Чи потрібно запускати другі запити один раз або на початку кожного сценарію?
Клацніть Upvote

13
CONVERT(column1 USING utf8)

Вирішує мою проблему. Де column1 - це стовпець, який дає мені цю помилку.


Для мене це спрацювало: CONVERT ("column1" ВИКОРИСТАННЯ ЛАТИН1)
shasi kanth

4

Використовуйте наступне твердження для помилки

будьте обережні щодо резервного копіювання даних, якщо дані є в таблиці.

 АЛЬТЕР ТАБЛИЦА__________________________________________________________________в… к CONV CONVVV CON CON CON SET CONV CON

2

Взагалі найкращий спосіб - це змінити зіставлення таблиці. Однак у мене є стара програма, і я не в змозі оцінити результат, чи має це побічні ефекти. Тому я намагався якось перетворити рядок у якийсь інший формат, який вирішив проблему зіставлення. Що я знайшов працююче - це порівняння рядків шляхом перетворення рядків у шістнадцяткове зображення його символів. У базі даних це робиться за допомогою HEX(column).PHP, ви можете використовувати цю функцію:

public static function strToHex($string)
{
    $hex = '';
    for ($i=0; $i<strlen($string); $i++){
        $ord = ord($string[$i]);
        $hexCode = dechex($ord);
        $hex .= substr('0'.$hexCode, -2);
    }
    return strToUpper($hex);
}

Виконуючи запит до бази даних, ваш початковий рядок UTF8 спочатку повинен бути перетворений у рядок iso (наприклад, використання utf8_decode()в PHP), перш ніж використовувати його в БД. Через тип зіставлення база даних не може містити символів UTF8 всередині, тому порівняння має працювати подій, хоча це змінює початковий рядок (перетворення символів UTF8, які не існують у ISO-шафі, призводить до того, що вони видаляються цілком). Просто переконайтесь, що, коли ви записуєте дані в базу даних, ви використовуєте те саме перетворення UTF8 в ISO.


2

У мене вперше була створена таблиця з CHARSET = latin1 . Після перетворення таблиці в utf8 деякі стовпці не були перетворені, однак це було не зовсім очевидно. Ви можете спробувати запустити SHOW CREATE TABLE my_table;і побачити, який стовпець не перетворений або просто виправити неправильний набір символів на проблемній колонці із запитом нижче (змінити довжину varchar і CHARSET та COLLATE відповідно до ваших потреб):

 ALTER TABLE `my_table` CHANGE `my_column` `my_column` VARCHAR(10) CHARSET utf8 
 COLLATE utf8_general_ci NULL;


0

Після внесення виправлень, зазначених у верхній відповіді, змініть настройки за замовчуванням свого сервера.

У вашому " /etc/my.cnf.d/server.cnf " або там, де він знаходиться, додайте параметри до розділу [mysqld], щоб це виглядало так:

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

Джерело: https://dev.mysql.com/doc/refman/5.7/uk/charset-applications.html


0

Я виявив, що використання cast()найкращого рішення для мене:

cast(Format(amount, "Standard") AS CHAR CHARACTER SET utf8) AS Amount

Також є convert()функція. Детальніше про нього тут

Ще один ресурс тут


0

Мій обліковий запис користувача не мав дозволу змінювати базу даних та таблицю, як було запропоновано в цьому рішенні .

Якщо, як я, вам не байдуже порівняння символів (ви використовуєте оператор '='), ви можете застосувати зворотне виправлення. Виконайте це перед вибором SELECT:

SET collation_connection = 'latin1_swedish_ci';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.