Установить набор символов с помощью MySQLi

Я извлекаю данные на арабском языке из таблиц MySQL с MySQLi. Поэтому я обычно использую это в процедурном стиле:

mysql_query("SET NAMES 'utf8'"); mysql_query('SET CHARACTER SET utf8'); 

Теперь я использую стиль ООП, поэтому я пытаюсь понять, есть ли что-то, что я мог бы установить, а не выше?

Я только нашел это в руководстве PHP, поэтому я это сделал, но как насчет установки имен в UTF8?

 $mysqli->set_charset("utf8"); 

Это то же самое:

$ mysqli-> query ("SET NAMES 'utf8'");

Из руководства:

Это предпочтительный способ изменить кодировку. Использование mysqli :: query () для выполнения SET NAMES .. не рекомендуется.

$mysqli->set_charset("utf8"); достаточно, пусть драйвер mysqli db сделает все для вас.

Вы должны использовать

 $mysqli->set_charset("utf8"); 

Не используйте SET NAMES или SET CHARACTER SET явно при использовании MySQLi., И, конечно же, не используйте оба варианта, как это было здесь. Причины, что это плохая идея:

  • Вызов SET CHARACTER SET utf8 после SET NAMES utf8 фактически просто отменяет часть работы, выполняемой SET NAMES .
  • Руководство PHP явно предупреждает нас об использовании mysqli_set_charset , а не SET NAMES :

    Это предпочтительный способ изменить кодировку. Использование mysqli_query () для его установки (например, SET NAMES utf8) не рекомендуется. Дополнительную информацию см. В разделе концепций набора символов MySQL.

  • Под капотом mysqli_set_charset является просто оболочкой для mysql_set_character_set из API MySQL C (или его эквивалента mysqlnd). Глядя на документы для этой функции , мы можем видеть разницу между ними и SET NAMES :

    Эта функция работает как оператор SET NAMES , но также устанавливает значение mysql->charset и, таким образом, влияет на набор символов, используемый mysql_real_escape_string()

    Другими словами, $mysqli->set_charset('foo') выполнит все функции SET NAMES foo , а также обеспечит соответствие mysqli_real_escape_string новой кодировке. Разумеется, если вы используете только кодировки, такие как Latin 1 и UTF 8, которые строго расширяют ASCII (то есть, которые кодируют все строки ASCII точно так же, как они были бы закодированы в ASCII), тогда использование SET NAMES вместо set_charset не сломает ничего , Однако, если вы используете более необычные кодировки, такие как GBK, тогда вы можете в конечном итоге обмануть свои строки или даже внедрить уязвимости SQL-инъекций, которые обходят mysqli_real_escape_string .

Поэтому хорошей практикой является использование set_charset , а не SET NAMES . Нет ничего, что делает SET NAMES этого set_charset , а set_charset позволяет избежать неправильной (или даже небезопасной) mysqli_real_escape_string .

Вы можете использовать это. Его действительно приятно для набора символов mysqli

 $dbhost = "localhost"; $dbuser = "root"; $dbpass = "dbpass"; $dbname = "dbname"; $conn = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); mysqli_query($conn,"SET CHARACTER SET 'utf8'"); mysqli_query($conn,"SET SESSION collation_connection ='utf8_unicode_ci'"); 

Для любителей процедурного стиля.

 // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); /* change character set to utf8 */ mysqli_set_charset($conn,"utf8"); 
 mysqli_query($conn,"SET NAMES 'latin5'"); 

$ conn = строка подключения