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
562   2  

2 ответов:

Контрольный список для задач с символами / кодировками / сортировками

Включая mysql, mysqli, PDO


Содержание

  1. отказ от ответственности
  2. моя вставка в моей БД не работает должным образом! Что я могу сделать?
  3. изменение кодировки и сортировки базы данных или таблицы
  4. задайте кодировку ваших файлов skript
  5. задайте кодировку вашей страницы с помощью php или мета-тега
  6. в чем разница между UTF8 и utf8?
  7. Ответ на этот конкретный вопрос
  8. Дополнительная Информация / Дополнительные Ссылки
  9. Боковые Примечания


1. Отказ от ответственности

Этот ответ должен не только ответить на этот вопрос, но и должен быть немного более обширным, чтобы больше людей быстрее находили связный и хороший ответ!

!Важное Замечание!
Если вы что-то меняете в своей базе данных, всегда делайте так, чтобы у вас была резервная копия вашей базы данных! Проверьте это 2 раза, или 3!

Я ... открыт для улучшений и комментариев, таких как исправления ошибок.
Кроме того, я прошу прощения, если грамматика не совершенна: D


Если вы застряли на таком вопросе:

  • 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
[54]}...тогда мой ответ может быть поможет вам!


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
Мой личный рейтинг:

  1. PDO
  2. mysqli
  3. mysql

Я бы рекомендовал вам использовать PDO или mysqli, потому что они имеют много преимуществ против mysql!

Я изменил параметры сортировки таблиц из SQLyog, но, похоже, он сломан. Когда я изменил их непосредственно из sql-запроса, это сработало.

Comments

    Ничего не найдено.