Я получаю следующую проблему коллайса в моем приложении, когда я пытаюсь выбрать что-то, где две строки равны:
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 и.
SET NAMES 'utf8'
Кроме того, убедитесь, что полевая кодировка – UTF8.