Специальные символы в PHP / MySQL - PullRequest
19 голосов
/ 11 марта 2009

У меня в базе данных есть слова, содержащие специальный символ (в основном на испанском, например, тильды). В базе данных все сохраняется и отображается правильно с помощью PHPmyAdmin, но когда я получаю данные (используя PHP) и отображаю их в браузере, я получаю странный символ, например «?» с квадратом ... Мне нужно общее исправление, чтобы мне не нужно было каждый раз экранировать каждый символ, а также я мог бы вставить специальные испанские символы из формы PHP в базу данных ...

HTML-код правильный:

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

Все таблицы и базы данных настроены на utf8_spanish

Персонаж, который я получаю: 100

Есть предложения ???

Спасибо !!!

Ответы [ 13 ]

31 голосов
/ 11 марта 2009

Я просто хотел бы предоставить более подробную информацию о решении, предложенном vartec , которое (в зависимости от вашей установки MySQL) является наиболее правильным решением вашей проблемы. Прежде всего, проблема с набором символов / кодированием в MySQL является довольно сложной темой, которая подробно рассматривается в руководстве по MySQL Глава 9.1 «Поддержка набора символов» . В вашем случае особенно 9.1.4. «Наборы символов соединения и сопоставления» будут наиболее актуальными.

Короче говоря: MySQL должен знать, какой набор символов / кодировка ожидает ваше клиентское приложение (исходя из точки зрения базы данных, это ваш PHP-скрипт), поскольку оно перекодирует все строковые данные из внутреннего набора символов / кодировки, определенного на уровне сервера, базы данных, таблицы или столбца в кодировку / кодировку соединения. Вы используете UTF-8 на стороне клиента, поэтому должны сообщить MySQL, что вы используете UTF-8. Это делается командой MySQL SET NAMES 'utf8', которую необходимо отправить в качестве первого запроса при открытии соединения. В зависимости от вашей установки и клиентской библиотеки MySQL, которую вы используете в сценарии PHP, это может быть сделано автоматически при каждом подключении.

Если вы используете PDO, это просто вопрос настройки параметра конфигурации

$db = new PDO($dsn, $user, $password);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");

Использование mysqli для изменения клиентского набора символов / кодировки еще проще:

$mysqli = new mysqli("localhost", "user", "password", "db");
$mysqli->set_charset("utf8");

Надеюсь, это поможет сделать все это более понятным.

10 голосов
/ 11 марта 2009

Выпуск SET NAMES 'utf8' сразу после подключения:

$mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("SET NAMES 'utf8'");
9 голосов
/ 11 марта 2009

MySQL переведет его автоматически

$conn = mysql_connect('host', 'user', 'password');
mysql_set_charset('utf8',$conn);

http://es.php.net/manual/en/function.mysql-set-charset.php

РЕДАКТИРОВАТЬ: из вашего комментария я понимаю, что это на самом деле закодировано в латинице 1, поэтому

mysql_set_charset('latin1_spanish_ci',$conn);
4 голосов
/ 05 мая 2013

Я нашел это откуда-то и с тех пор использовал его целиком, не слишком задумываясь.

mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
4 голосов
/ 11 марта 2009

Изменена кодировка HTML на ISO-8859-1, исправлена ​​проблема! Глупый

2 голосов
/ 26 декабря 2014

Вы можете просто сделать:

$link = mysql_connect("host", "user", "password");
mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);
2 голосов
/ 13 ноября 2009

святое дерьмо .. это сводило меня с ума. Я пытался сделать то же самое. я добавил заголовок HTML в кодировке utf-8 .. mysqli_set_charset () спас меня несколько часов спустя, но я рад, что он работает сейчас

Еще одна функция для кодирования специальных символов и ударений - htmlentities ()

1 голос
/ 06 марта 2018

Ответ, который сработал для меня, тот, который Стефан Гериг написал:

$ mysqli-> set_charset ( "utf8");

Мне просто нужно было добавить эту строку после того, как я определил соединение и мои проблемы были решены! :)

(Я отправляю ответ, так как не могу комментировать ...).

1 голос
/ 11 марта 2009

Вы уверены, что у вас есть данные UTF8 в вашей базе данных для начала?

1 голос
/ 11 марта 2009

При работе со специальными символами я всегда забочусь о следующем:

  • Базы данных, наборы символов таблиц и полей имеют все значения: utf8_general_ * или utf8_unicode _ *
  • Я уверен, что мой редактор сохраняет файлы PHP с правильным набором символов
  • Я установил default_charset в php.ini в UTF-8 или
  • Я отправляю Content-Type: text / html; charset = UTF-8 header
  • Кодировка в теге META - это UTF-8 (переопределяется HTTP-заголовком Content-Type)
  • При подключении к MySQL я выдаю следующие запросы:
    • SET NAMES utf8
    • SET CHARACTER SET utf8
    • SET COLLATION_CONNECTION = "utf8_general_ci" / "utf8_general_ci"
...