Я извлекаю данные на арабском языке из таблиц 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 = строка подключения