Php + Mysql (UTF-8) некоторые символы все еще баг
Ну я получил php скрипт, который берет Ники из Steam web-api и вставляет их в mysql db. Многие из них получили редкие русские и греческие иероглифы. Я установил php в utf-8 в php.ini и во всех php файлах с
mb_internal_encoding('utf-8');
Мой PDO-коннектор настроен на обработку utf8
$connection = new PDO('mysql:host=localhost;dbname=d2bd;mysql:charset=utf8', 'root', '');
$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$connection->setAttribute(PDO::ATTR_PERSISTENT, true);
$connection->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'");
Моя база данных mysql правильно настроена с utf8
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8
character_sets_dir C:xamppmysqlsharecharsets
collation_connection utf8_unicode_ci
collation_database utf8_unicode_ci
collation_server utf8_unicode_ci
completion_type NO_CHAIN
concurrent_insert AUTO
connect_timeout 10
core_file OFF
В нескольких словах я беру вход web-api и кодирую его с помощью uft8_encode(). Затем я вставляю его в БД. Проблема дело в том, что некоторые символы плохо закодированы, и когда я вспоминаю их из базы данных, они все прослушиваются.
Пример 1:
1.Вход -> Перуанский чертовски
2.Encode - > Ððμññð°Ð½ÑкÐÐ1 Ñðμññðïð2ñðºð
3.Вставить в DB
4.Выбрать из DB - > Ð?еÑ?- ?анÑкÐÐ1 -?еÑ?- ?оÐ2ÑкÐ
[3]}5.Декодировать
[3]}6.Вывод -> �?е�?�?анский �?е�?�?овск �
Пример 2:
1.Входные Данные -> $ |/| 1 ↓_ € ♥ J
2.Закодировать - > $|//1 â_ â â J
3.Вставить в DB
4.Выберите из БД -> 1??_ â? - что?¥ J
[3]}5.Декодировать
[3]}6.Выход -> 1 �??- что?� �?� J
2 ответов:
Контрольный список для задач с символами / кодировками / сортировками
Включая
mysql
,mysqli
,PDO
Содержание
- отказ от ответственности
- моя вставка в моей БД не работает должным образом! Что я могу сделать?
- изменение кодировки и сортировки базы данных или таблицы
- задайте кодировку ваших файлов skript
- задайте кодировку вашей страницы с помощью php или мета-тега
- в чем разница между UTF8 и utf8?
- Ответ на этот конкретный вопрос
- Дополнительная Информация / Дополнительные Ссылки
- Боковые Примечания
1. Отказ от ответственности
Этот ответ должен не только ответить на этот вопрос, но и должен быть немного более обширным, чтобы больше людей быстрее находили связный и хороший ответ!
!Важное Замечание!
Если вы что-то меняете в своей базе данных, всегда делайте так, чтобы у вас была резервная копия вашей базы данных! Проверьте это 2 раза, или 3!Я ... открыт для улучшений и комментариев, таких как исправления ошибок.
Кроме того, я прошу прощения, если грамматика не совершенна: D
Если вы застряли на таком вопросе:
[54]}...тогда мой ответ может быть поможет вам!
- Php + Mysql (UTF-8, utf8) некоторые символы все еще являются ошибкой
- Как преобразовать весь набор символов базы данных MySQL и параметры сортировки в UTF-8?
- "неверное строковое значение" при попытке вставить UTF-8 в MySQL
- изменить набор символов MySQL по умолчанию к UTF-8 в моем.cnf?
- использование utf8 с php и mysql
- PDO + MySQL и сломанная кодировка UTF-8
- ошибка при вставке данных в php Mysql
- PHP PDO: кодировка, имена наборов?
- набор имен utf8 в MySQL?
- PHP mysql charset utf8 задачи
- UTF-8 полностью
- манипулирование данными utf8 из MySQL с помощью PHP
- ошибка 1115 (42000): неизвестный набор символов: 'utf8' в mysql
2. Моя вставка в моей БД не работает должным образом! Что я могу сделать?
Если ваша вставка не работает должным образом и ваши вставленные данные выглядят примерно так в вашей базе данных, то это может иметь различные причины!
Примеры:
?????????? �??_ �?� â_ ⬠⥠J
Вот небольшой контрольный список, который вы можете пройти и проверить, все ли так, как должно быть!
(После контрольного списка есть несколько дополнительных сведений дляmysql
,mysqli
и ещеPDO
)
Контрольный список:
- убедитесь, что наборы символов по умолчанию установлены в таблицах, клиентских, серверных и текстовых полях.
- если нет, смотрите пункт 3
- убедитесь, что ваша база данных подключает наборы символов
- если не смотрите пункт mysql / PDO
- убедитесь, что при отображении данных задана кодировка документа!
- если нет, смотрите пункт 5
- убедитесь, что ваш файлы skript сохраняются с правильной кодировкой!
- если нет, смотрите пункт 4
- убедитесь, что вы установили свой характер и свою кодировку!
- если не смотрите пункт mysql / PDO
- убедитесь, что ваши формы принимают utf8!
- если нет, смотрите пункт 5
- убедитесь, что вы установили кодировку соединения.
- если не смотрите пункт mysql / pdo
- убедитесь, что вы установили кодировку servercharacter право
- если не смотрите пункт mysql / pdo
...
Вы должны быть уверены, что используете utf8/ utf8 везде!
Mysql:
-
mysql_query("SET NAMES 'utf8'");
запускайте имена наборов перед каждым используемым запросом. Потому что если драйвер mysql не доказал mechanismus к charset, то вы должны использовать имена наборов!
-mysql_query("SET CHARACTER SET utf8 ");
установить символ в utf8
-mysql_set_charset('utf8');
установите кодировку utf8
- драйвер mysql API не работает . поддержка utf8 (ошибка 1115 (42000))
-character_set_server=utf8
для установки символа сервераPDO:
-
$dbh->exec("set names utf8");
Если вы используете PDO, вы можете использовать эту строку для установки имен
-$dbh = new PDO("mysql:host=$host;dbname=$db;charset=utf8");
эта строка задает кодировку, но вы должны иметь PHP 5.3.6 или выше
-$dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8' COLLATE 'utf8_unicode_ci' ");
вы также можете задать имена наборов с помощью этой строки
-mb_internal_encoding('UTF-8');
для установки кодировки при использовании PDO
3. Изменить кодировку и параметры сортировки базы данных или таблицы
Если придется изменить кодировку или параметры сортировки базы данных или таблицы можно с помощью следующих строк кода:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
4. Установите кодировку ваших файлов skript
Возможно, вам придется проверить, что ваши файлы skript(php) сохранены с правильной кодировкой!
Для этого я бы рекомендовал вам Notpad++!
Если вы открыли свой файл в notpad, перейдите в menupoint 'Encoding' и измените кодировку
[29]}5. Установите кодировку ваша страница с php или meta тегом
Для отображения данных в utf8/utf8 вы должны быть уверены, что ваш сайт настроен с правильной кодировкой!
Вы можете установить кодировку тремя способами следующим образом:
//PHP ini_set("default_charset", "UTF-8"); header('Content-type: text/html; charset=UTF-8'); //HTML <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Также, чтобы принять utf8 в вашей форме используйте:
<form accept-charset="UTF-8">
[29]}6. В чем разница между UTF8 и utf8?
UTF8:
- utf8 поддерживает только символы с 3 байтами
- ...(еще много)utf8:
- utf8mb3 поддерживает символы с 4 байтами
- ... ..(еще много)
7. Ответ на этот конкретный вопрос
Я думаю, что это должно работать, так как вы используете
PDO
:
(После того, как вы создали объект PDO! Если вы используете версию PHP меньше 5.3.6)$dbh->exec("set names utf8");
В противном случае попробуйте выполнить одно из следующих действий:
ini_set("default_charset", "UTF-8"); header('Content-type: text/html; charset=UTF-8');
Обновление:
Чтобы изменить
collation
илиcharset
изdatabase
илиtable
, используйте следующее:ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
8. В дальнейшем Информация / Дополнительные Ссылки
[29]}9. Боковые Примечания
9.1 Отчеты Об Ошибках
Если ошибка не отображается, используйте этот фрагмент кода:<?php error_reporting(E_ALL); ini_set("display_errors", 1); ?>
9.2 Unicode
Чтобы вы не ошиблись, вы должны действительно понять utf8!9.3 одно слово для mysql, mysqli и PDO
Мой личный рейтинг:
- PDO
- mysqli
- mysql
Я бы рекомендовал вам использовать PDO или mysqli, потому что они имеют много преимуществ против mysql!
Я изменил параметры сортировки таблиц из SQLyog, но, похоже, он сломан. Когда я изменил их непосредственно из sql-запроса, это сработало.
Comments