Установка кодировки в UTF-8 для текущего соединениния с MySQL

Afipsky

На данный вопрос уже ответили:

Добрый день.

Результат sql-запроса возвращается не в UTF-8 кодировке. Пытался установить кодировку с помощью функции mysql_set_charset('utf8',$db), но по все видимости функция не работает, при том, что MySQL версии 5.0.7. Как можно по другому задать кодировку соединения, но не используя SET NAMES?

З.Ы. Когда работал с той же таблицей при помощи PDO, при установке кодировки:

$db->exec('SET CHARACTER SET utf8')

Поля возвращались в UTF-8.

5 ответов

Afipsky

Самый 100%ый код для 100%ого UTF-8 :D

mysql_query("SET NAMES 'utf8'"); 
mysql_query("SET CHARACTER SET 'utf8'");
mysql_query("SET SESSION collation_connection = 'utf8_general_ci'");


Afipsky

  1. Оригинальное API MySQL (функции mysql_) устарело, начиная с версии PHP 5.5.0, и удалено в PHP 7.0.0.
  2. Для улучшенного модуля MySQL (MySQL Improved) предпочтительным способом является использование метода set_charset().

    ...
    $mysqli->set_charset('utf8');
    ...

    или

    ...
    mysqli_set_charset($link, 'utf8');
    ...

    Использование для этих целей метода query() (например: SET NAMES 'utf8') не рекомендуется.

  3. В PDO следует указывать кодировку соединения в параметре dsn при создании экземпляра класса работы с бд:

    ...
    $dsn = 'mysql:dbname=DB;host=HOST;charset=utf8';
    $pdo = new \PDO($dsn, $user, $password, $options);
    ...

P.S. Для работы с четырехбайтовым UTF-8 (например, чтобы эмодзи сохранялись в базу) вместо кодировки utf8 следует использовать кодировку utf8mb4. База также должна быть настроена с использованием utf8mb4.


Afipsky

SET NAMES 'utf-8'


Afipsky

Если проблема с несрабатываением функции mysql_query("SET NAMES utf8") на локальном веб-сервере denwer - то это связано с тем, что в параметрах denwer по умолчанию назначена кодировка cp1251 - сутки голову ломал.


Afipsky

mysql_query('SET NAMES utf8 COLLATE utf8_general_ci');

licensed under cc by-sa 3.0 with attribution.