Неверное смешение параметров сортировки MySQL Error - PullRequest
106 голосов
/ 17 июня 2009

Я получаю эту странную ошибку при обработке большого количества данных ...

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 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'

Что я могу сделать, чтобы решить эту проблему? Могу ли я каким-либо образом экранировать строку, чтобы эта ошибка не возникала, или мне нужно как-то изменить кодировку таблицы, и если да, то на что мне ее поменять?

Ответы [ 8 ]

255 голосов
/ 17 июня 2009
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 пробирается туда на шведском языке иногда без видимой причины.

12 голосов
/ 17 июня 2009

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

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

и

SET NAMES 'UTF8';
SET CHARACTER SET 'UTF8';
7 голосов
/ 23 апреля 2018
CONVERT(column1 USING utf8)

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

2 голосов
/ 11 января 2018

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

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

 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
0 голосов
/ 12 марта 2019

Изменить набор символов таблицы на utf8

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8

0 голосов
/ 22 марта 2018

После внесения исправлений, перечисленных в верхнем ответе, измените настройки сервера по умолчанию.

В вашем " / 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 голосов
/ 08 октября 2017

Моя таблица изначально была создана с 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 голосов
/ 12 февраля 2016

В общем, лучший способ - изменить параметры сортировки таблицы. Однако у меня есть старое приложение, и я не могу точно оценить результат, имеет ли это побочные эффекты. Поэтому я попытался как-то преобразовать строку в какой-то другой формат, который решил проблему с сортировкой. Я обнаружил, что работа заключается в сравнении строк путем преобразования строк в шестнадцатеричное представление их символов. В базе данных это делается с помощью 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.

...