Недопустимое сочетание сортировок PHP MYSQL, latin1_swedish_ci и utf8_general_ci

Я получаю следующую проблему коллайса в моем приложении, когда я пытаюсь выбрать что-то, где две строки равны:

SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' 

В stacktrace я могу увидеть параметр Lamellt \ xE4ckning, что означает Lamelltäckning, и я думаю, что мой параметр неявно вызывает латинское значение latin1_swedish_ci.

моя вся база данных использует это:

 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci 

Когда я вставляю строки из PHP, я просто делаю простую вставку:

 $name = "Lamelltäcke"; $db->update("insert into...."); 

Данные, которые я сейчас пытаюсь использовать, поступают из CSV-файла, и я не знаю, смогу ли я решить это, просто установив коллирование i каким-то образом или мне нужно каким-то образом преобразовать String

В чем проблема? И как я могу это решить?


Это проблема, когда я вставляю данные из PHP. Я сделал соединение pdo следующим образом:

 $db = new \PDO($dsn, $config->db_user, $config->db_pass, array(\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 

Когда я определяю строку как

 $str = "åuuäuuö"; 

В PHP и вставить его нет проблем. Но когда я получаю строку из почтового запроса, я могу просто откликнуться

  "åuuäuuö" 

Однако в базе данных она вставлена ​​как

 "?uu?uu?" mb_detect_encoding($str); 

дает: UTF-8


Проблема заключалась в кодировании самой строки. Моя база данных использует UTF-8, но кодировка была ISO-8859-x. Чтобы все было хуже, у моего клиента Java также была другая кодировка, из-за которой это было трудно отлаживать. Он называется «Цитированная строка».

Что, наконец, помогло мне решить проблему, это фрагмент кода PHP, который берет строку и преобразует ее из всех возможных кодировок в UTF-8 и печатает ее. Look for a row where your string is printed correctly and there is your encoding of the string. Затем, когда вы получите правильную кодировку, rencode свою строку, используя mb_convert_encoding .

 $str = "String of unknown encoding with chars like äåö or something else"; foreach(mb_list_encodings() as $chr){ echo mb_convert_encoding($str, 'UTF-8', $chr)." : ".$chr."\r\n"; } 

Следует отметить, что клиент также использует правильную кодировку. В моем случае это была Java-программа, в обычном случае это будет ваш webapp / browser и.

  • Попробуйте преобразовать ваш файл PHP в UTF8
  • Сразу после подключения к базе данных сделайте запрос с помощью SET NAMES 'utf8'

Кроме того, убедитесь, что полевая кодировка – UTF8.