2017-01-21 10 views
0

Глядя здесь: http://www.php.net/manual/en/mysqlinfo.concepts.charset.phpЯвляется ли PDO ... SET NAMES utf8 опасным?

Я понимаю, что с помощью

SET NAMES utf8

не является хорошей идеей, но не ясно:

  1. Что такое проблема?
  2. Как этого избежать?
  3. На самом деле это решение установить кодировку для (или всех) PDO-соединений в PHP 3.6 или выше?

Код Боюсь опасно:

$this->_conn = new PDO('mysql:host=host.name.blabla;dbname=my_database_name','username', 'password',array(
       PDO::ATTR_PERSISTENT => true, 
       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
       PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' 
      )); 

Спасибо!

+1

Связанная страница содержит довольно глубокие рассуждения о том, каковы последствия. Пожалуйста прочти! – hjpotter92

ответ

2

Вы действительно используете PHP> = версия 3.6 и < 5.3.6?

Если у вас есть 5.3.6 или более поздней версии ...

Character sets и PDO_MYSQL DSN говорят, что вы должны использовать

$pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8", 
       'my_user', 'my_pass'); 

И следует (не достаточно ясно), что utf8 следует заменить utf8mb4 если это необходимо.

PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' не так хорошо, но был альтернативой до 5.3.6.

Я думаю, что «опасно» слишком сильное слово, даже пред-5.3.6.

Родственный способ: Использование init_command = SET NAMES ... в my.cnfплохо потому init_command не выполняется при подключении в качестве root.

utf8mb4 является предпочтительным CHARACTER SET для UTF-8, поскольку он включает в себя Emoji и некоторые китайские символы, отсутствующие в utf8. Эта кодировка доступна с версии MySQL 5.5.3.

+0

Oook, я на самом деле использую PHP 5.6. Поэтому ваши решения должны работать ... но я пробовал оба: utf8mb4 и utf8 ... без работы. Я сделаю еще один выстрел. Но если это действительно не опасно, он останется таким же, как сейчас (код, который я вставил раньше). Спасибо большое! – eMarine