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

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

Пример 1:

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

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

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

4.Выберите из БД -> Ð? еÑ? Ñ? Ð ° нÑкий Ñ? еÑ? Ñ? овÑкÐ

5.Decode

6.Выход -> ? Е ? ? Анский ? Е ? ? Овск

Пример 2:

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

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

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

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

5.Decode

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

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 charset utf8 проблемы
  • UTF-8 полностью
  • Управление данными utf8mb4 из MySQL с помощью PHP
  • ОШИБКА 1115 (42000): неизвестный набор символов: ‘utf8mb4’ в mysql

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

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

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

Примеры:

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

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

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

  • Убедитесь, что наборы символов по умолчанию установлены для таблиц, клиентов, серверов & текстовые поля
    • Если нет, см. Пункт 3
  • Убедитесь, что ваши наборы символов подключений к базе данных
    • Если нет, см. Пункт MySQL / PDO
  • Убедитесь, что в ваших отображаемых данных установлена ​​кодировка документа!
    • Если нет, см. Пункт 5
  • Убедитесь, что ваши файлы скриптов сохранены с правильной кодировкой!
    • Если нет, см. Пункт 4
  • Убедитесь, что вы установили свой характер и свою кодировку!
    • Если нет, см. Пункт MySQL / PDO
  • Убедитесь, что вы принимаете формы utf8!
    • Если нет, см. Пункт 5
  • Убедитесь, что вы установили кодировку соединения
    • Если нет, см. Пункт mysql / pdo
  • Убедитесь, что вы правильно установили кодировку символов сервера
    • Если нет, см. Пункт 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 ++!

Если вы открыли свой файл в 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. PDO
  2. MySQLi
  3. MySQL

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

10

Другие решения

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

0

По вопросам рекламы [email protected]