Я получаю эту странную ошибку при обработке большого количества данных ...
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 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'
Что я могу сделать, чтобы решить эту проблему? Могу ли я как-то избежать строки, чтобы эта ошибка не возникла, или мне нужно как-то изменить кодировку таблицы, и если да, то на что мне ее изменить?
mysql
sql
mysql-error-1267
Нажмите Голосовать за
источник
источник
Ответы:
затем для ваших баз данных
MySQL иногда пробирается туда на шведском языке без всякой разумной причины.
источник
Вы должны установить как кодировку таблицы, так и кодировку соединения
UTF-8
:и
источник
myDb
ИЗМЕНИТЬ НАБОР СИМВОЛОВ БАЗЫ ДАННЫХ ПО УМОЛЧАНИЮ utf8 СОБРАТЬ utf8_bin. Это сработает? Это сделано для того, чтобы это повлияло на все мои таблицы, а не только на одну из нихРешает мою проблему. Где column1 - это столбец, который дает мне эту ошибку.
источник
Используйте следующую инструкцию для ошибки
будьте осторожны с вашими данными, сделайте резервную копию, если данные есть в таблице.
источник
В общем, лучший способ - изменить сортировку таблицы. Однако у меня есть старое приложение, и я не могу оценить результат, есть ли у него побочные эффекты. Поэтому я попытался как-то преобразовать строку в какой-то другой формат, который решил проблему сопоставления. Я обнаружил, что работает, это сравнивать строки путем преобразования строк в шестнадцатеричное представление их символов. В базе данных это делается с помощью
HEX(column).
PHP, вы можете использовать эту функцию:При выполнении запроса к базе данных ваша исходная строка UTF8 должна быть сначала преобразована в строку iso (например, с использованием
utf8_decode()
в PHP), прежде чем использовать ее в базе данных. Из-за типа сопоставления база данных не может содержать символы UTF8 внутри, поэтому сравнение должно работать, хотя это изменяет исходную строку (преобразование символов UTF8, которые не распространяются в кодировке ISO, приводит к? Или они полностью удаляются). Просто убедитесь, что при записи данных в базу данных вы используете одно и то же преобразование UTF8 в ISO.источник
Моя таблица изначально была создана с помощью CHARSET = latin1 . После преобразования таблицы в utf8 некоторые столбцы не были преобразованы, однако это было не совсем очевидно. Вы можете попробовать запустить
SHOW CREATE TABLE my_table;
и посмотреть, какой столбец не был преобразован, или просто исправить неправильный набор символов в проблемном столбце с запросом ниже (измените длину varchar, CHARSET и COLLATE в соответствии с вашими потребностями):источник
Измените набор символов таблицы на utf8
источник
После внесения исправлений, перечисленных в верхнем ответе, измените настройки вашего сервера по умолчанию.
В вашем " /etc/my.cnf.d/server.cnf " или где бы то ни было, добавьте значения по умолчанию в раздел [mysqld], чтобы он выглядел так:
Источник: https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
источник
Я обнаружил, что использование
cast()
было для меня лучшим решением:Также есть
convert()
функция. Подробнее об этом здесьДругой ресурс здесь
источник
У моей учетной записи не было разрешений на изменение базы данных и таблицы, как это предлагается в этом решении .
Если, как и я, вас не волнует сопоставление символов (вы используете оператор '='), вы можете применить обратное исправление. Запустите это перед вашим SELECT:
источник