Недопустимое сочетание сопоставлений Ошибка 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

Ответы:


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: Спасибо за решение, которое можно напрямую скопировать. Сэкономил мне много времени.
Pistos 03

15
@Ben: Изначально он был разработан шведской компанией ... Это причина раздражающей начальной настройки latin1_swedish_ci .. :(
Vajk Hermecz

1
У меня не было разрешений на выполнение первого оператора, но он работал, просто выполняя таблицу,
Роб Седжвик,

Люблю тебя за это! : P
prateekkathal

Похоже, это работает для многих людей, но, к сожалению, у меня все еще есть эта проблема даже после того, как я попробовал все устройства в этой теме. Моя база данных по умолчанию параметры сортировки упорно отказывается изменения от «ucs2_bin» , так что даже попытался изменить все таблицы и связь сверка с «usc2_bin» , но я все еще получаю ошибку «Ошибка SQL (1267): Illegal смесь сортировки (utf8_general_ci, неявные) и (ucs2_bin, IMPLICIT) для операции '=' ".
bikeman868

15

Вы должны установить как кодировку таблицы, так и кодировку соединения UTF-8:

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

и

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

Нужны ли они оба, или я могу просто сделать одно из них?
Click Upvote

myDbИЗМЕНИТЬ НАБОР СИМВОЛОВ БАЗЫ ДАННЫХ ПО УМОЛЧАНИЮ utf8 СОБРАТЬ utf8_bin. Это сработает? Это сделано для того, чтобы это повлияло на все мои таблицы, а не только на одну из них
Click Upvote

1
ALTER DATABASE не изменит текущие настройки таблицы, а только новые. Хотя не помешает также изменить кодировку по умолчанию для базы данных.
Quassnoi

SET NAMES и SET CHARACTER SET изменят кодировку вашего соединения. Эти команды необходимо вводить каждый раз при подключении. Ваша клиентская библиотека может поддерживать более элегантный метод для этого (php :: mysqli поддерживает, php :: mysql - нет).
Quassnoi

Кажется, сейчас работает, я приму после еще нескольких тестов. Нужно ли запускать вторые запросы один раз или в начале каждого скрипта?
Нажмите Upvote

13
CONVERT(column1 USING utf8)

Решает мою проблему. Где column1 - это столбец, который дает мне эту ошибку.


Для меня это сработало: CONVERT ("column1" USING LATIN1)
shasi kanth

4

Используйте следующую инструкцию для ошибки

будьте осторожны с вашими данными, сделайте резервную копию, если данные есть в таблице.

 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

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/en/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.