Ну, я получил скрипт 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
mysql
, mysqli
, PDO
Этот ответ должен не только отвечать на этот вопрос, но и должен быть более обширным, чтобы больше людей быстрее находили в комплекте и хороший ответ!
!Важное замечание!
Если вы что-то изменяете в своей базе данных, всегда делайте так, чтобы у вас была резервная копия базы данных! Проверьте это 2 раза или 3!
Я открыт для улучшений и комментариев, таких как исправление ошибок.
Кроме того, я прошу прощения, если грамматика не совершенна: D
Если вы застряли на вопросе вроде этого:
…тогда мой ответ, возможно, поможет вам!
Если ваша вставка не работает должным образом или ваши вставленные данные выглядят примерно так в вашей базе данных, то это может иметь разные причины!
Примеры:
??????????
�??_ �?�
â_ ⬠⥠J
Вот небольшой контрольный список, который вы можете попробовать и проверить, все ли так, как должно быть!
(После контрольного списка есть несколько дополнительных сведений для mysql
, mysqli
а также 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
Если вам нужно изменить кодировку или сопоставление базы данных или таблицы, вы можете использовать следующие строки кода:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Возможно, вам придется проверить, что ваши файлы скриптов (php) сохранены с правильной кодировкой!
Для этого я бы порекомендовал вам Notpad ++!
Если вы открыли свой файл в notpad, перейдите в пункт меню «Кодировка» и измените кодировку
Для отображения данных в 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">
UTF8:
-utf8 поддерживает только символы с 3 байтами
-…(многое другое)
UTF8MB4:
-utf8mb3 поддерживает символы с 4 байтами
-…(многое другое)
Я думаю, что это должно работать, так как вы используете 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;
9.1 Отчет об ошибках
Если ошибка не отображается, используйте этот фрагмент кода:
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
?>
9.2 Юникод
Чтобы не ошибиться, нужно по-настоящему понять utf8!
9.3 Одно слово для mysql, mysqli и PDO
Мой личный рейтинг:
Я бы порекомендовал вам использовать PDO или MySQL, потому что у MySQL есть много преимуществ!
Я изменил порядок сортировки таблиц в SQLyog, но, похоже, он не работает. Когда я изменил их непосредственно из SQL-запроса, это сработало.