Php + Mysql (UTF-8) некоторые символы все еще являются ошибкой

Ну, у меня есть php-скрипт, который берет прозвища из веб-API Steam и вставляет их в базу данных mysql. Многие из них получили редкие русские и греческие буквы. Я установил php в utf-8 в php.ini и во всех файлах php с помощью

mb_internal_encoding('utf-8');

Мой коннектор PDO настроен на обработку utf8

$connection = new PDO('mysql:host=localhost;dbname=d2bd;mysql:charset=utf8mb4', '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 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'");

моя база данных mysql правильно настроена с помощью utf8mb4

character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8
character_sets_dir C:\xampp\mysql\share\charsets\
collation_connection utf8mb4_unicode_ci
collation_database utf8mb4_unicode_ci
collation_server utf8mb4_unicode_ci
completion_type NO_CHAIN
concurrent_insert AUTO
connect_timeout 10
core_file OFF

В двух словах я беру ввод веб-API и кодирую его с помощью uft8_encode(). Затем я вставляю его в БД. Проблема в том, что некоторые символы плохо закодированы, и когда я вспоминаю их из базы данных, все они прослушиваются.

Пример 1:

1.Input -> Перуанский чертовски

2.Encode -> ÐеÑÑанÑкий ÑеÑÑовÑки

3. Вставить в БД

4.Выбрать из БД -> Р?РµС?С?Р°Р½СРºР¸Р¹ С?РµС?С?Р¾Р²СРºР

5. Декодировать

6.Вывод -> �?е�?�?анский �?е�?�?овск�

Пример 2:

1. Ввод -> $ |/| 1 ↓_ € ♥ J

2. Кодировать -> $ |/| 1 â_ ⬠⥠J

3. Вставить в БД

4. Выберите из БД -> 1 â??_ â?¬ â?¥ J

5. Декодировать

6.Выход -> 1 �??_ �?� �?� J


person holyknight    schedule 07.11.2014    source источник
comment
Нет необходимости кодировать/декодировать строки, если ваше приложение не соответствует стандарту ISO-8859-1, но похоже, что это не так.   -  person Karolis    schedule 07.11.2014
comment
хорошо, если я не кодирую и не декодирую строки, они полностью прослушиваются в базе данных. В первом примере, если я его не кодирую, результат будет ????????? ?????   -  person holyknight    schedule 07.11.2014
comment
Я почти уверен, что проблема где-то в другом. Какова кодировка вашей веб-страницы?   -  person Karolis    schedule 07.11.2014
comment
ты имеешь ввиду хтмл? потому что я не получаю имена из пользовательского ввода. Я получил их прямо из steamapi в формате JSON.   -  person holyknight    schedule 07.11.2014
comment
@holyknight Попробуйте эти две строки кода: ini_set("default_charset", "UTF-8"); header('Content-type: text/html; charset=UTF-8');   -  person Rizier123    schedule 07.11.2014
comment
Как по мне, входная кодировка не UTF-8 и не ISO-8859-1. Является ли это возможным?   -  person Karolis    schedule 07.11.2014
comment
ммм думаю можно.   -  person holyknight    schedule 07.11.2014
comment
Я кодирую и декодирую эти строки без вставки в базу данных, и все в порядке.   -  person holyknight    schedule 08.11.2014


Ответы (2)


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

В том числе mysql, mysqli, PDO


Содержание

  1. ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ
  2. Моя вставка в мою БД не работает должным образом! Что я могу сделать?
  3. Изменить набор символов и сопоставление базы данных или таблицы
  4. Установите кодировку ваших файлов скрипта
  5. Установите кодировку вашей страницы с помощью php или метатега
  6. В чем разница между UTF8 и UTF8mb4?
  7. Ответ на этот конкретный вопрос
  8. Дополнительная информация/дополнительные ссылки
  9. Дополнительные примечания


1. ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ

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

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

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


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

  • Php + Mysql (UTF-8, utf8mb4) некоторые символы все еще глючат
  • Как преобразовать весь набор символов и сопоставление базы данных MySQL в UTF-8?
  • «Неправильное строковое значение» при попытке вставить UTF-8 в MySQL
  • Изменить набор символов MySQL по умолчанию на UTF-8 в my.cnf?
  • Использование utf8mb4 с php и mysql
  • PDO + MySQL и сломанная кодировка UTF-8
  • Ошибка при вставке данных в php Mysql
  • PHP PDO: кодировка, набор имен?
  • УСТАНОВИТЬ ИМЕНА utf8 в MySQL?
  • Проблемы с кодировкой PHP mysql utf8
  • UTF-8 полностью
  • Манипулирование данными utf8mb4 из MySQL с помощью PHP
  • ОШИБКА 1115 (42000): Неизвестный набор символов: «utf8mb4» в mysql

... тогда мой ответ, возможно, поможет вам!


2. Моя вставка в моей БД не работает должным образом! Что я могу сделать?

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

Примеры:

??????????
????????????????
�??_ �?�
â_ ⬠⥠J

Вот небольшой контрольный список, по которому вы можете проверить, все ли так, как должно быть!
(После контрольного списка есть несколько дополнительных сведений для mysql, mysqli и PDO)


Контрольный список:

  • Make sure default character sets is set on tables, client, server & text fields
    • If NOT See Point 3
  • Make sure your database connections character sets
    • IF NOT See Point mysql/PDO
  • Make sure if your displaying data that the charset of the document is set!
    • IF NOT See Point 5
  • Make sure your skript files are saved with the right charset!
    • IF NOT See Point 4
  • Make sure you set your character and your charset!
    • IF NOT See Point mysql/PDO
  • Make sure you forms accept utf8!
    • IF NOT See Point 5
  • Make sure you have set the connection encoding
    • IF NOT See Point mysql/pdo
  • Make sure you have set the servercharacter encoding right
    • IF NOT See Point mysql/pdo
  • ...

  • Вы должны быть уверены, что везде используете utf8/utf8mb4!


mysql:

-mysql_query("SET NAMES 'utf8'"); Запускайте SET NAMES перед каждым используемым запросом. Потому что, если драйвер mysql не предоставляет механизм для кодировки, вам нужно использовать SET NAMES!
-mysql_query("SET CHARACTER SET utf8 "); Установить символ utf8
-mysql_set_charset('utf8'); Установить кодировку utf8
-драйвер API mysql не поддерживает utf8mb4 (ОШИБКА 1115 (42000))
-character_set_server=utf8 установить сервер персонаж

PDO:

-$dbh->exec("set names utf8"); Если вы используете PDO, вы можете использовать эту строку для SET NAMES
-$dbh = new PDO("mysql:host=$host;dbname=$db;charset=utf8"); Эта строка устанавливает кодировку, но у вас должен быть PHP 5.3.6 или выше
-$dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' "); Вы также можете установить SET NAMES с помощью этого строка
-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. Установите кодировку ваших файлов скрипта

Возможно, вам придется проверить, что ваши файлы скрипта (php) сохранены с правильной кодировкой!

Для этого я бы порекомендовал вам Notpad++!

Если вы открыли свой файл в блокноте, перейдите в пункт меню «Кодировка» и измените кодировку


5. Установите кодировку вашей страницы с помощью php или метатега.

Для отображения данных в utf8/utf8mb4 вы должны быть уверены, что на вашем сайте установлена ​​правильная кодировка!

Вы можете установить кодировку тремя способами:

//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">


6. В чем разница между UTF8 и UTF8mb4?

UTF8:
-utf8 поддерживает только символы с 3 байтами
-... (многие другие)

UTF8MB4:
-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 utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;


8. Дополнительная информация/дополнительные ссылки


9. Дополнительные примечания

9.1 Отчеты об ошибках
Если ошибка не отображается, используйте этот фрагмент кода:

<?php
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
?>

Юникод 9.2
Чтобы не ошибиться, нужно хорошо понимать utf8!

9.3 Одно слово о mysql, mysqli и PDO
Мой личный рейтинг:

  1. ЗОП
  2. mysqli
  3. СУБД

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

person Rizier123    schedule 07.11.2014

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

person holyknight    schedule 07.11.2014