我正在使用 MySQLi 从 MySQL 表中获取阿拉伯语数据。所以我通常以程序风格使用它:
mysql_query("SET NAMES 'utf8'");
mysql_query('SET CHARACTER SET utf8');
现在我使用的是 OOP 风格,所以我想看看是否有一些我可以设置的东西而不是上面的?
我只在 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");
使用 MySQLi 时不要使用SET NAMES
或SET CHARACTER SET
显式使用。当然也不要像这里最初的提问者那样使用两者。这是一个坏主意的原因:
SET CHARACTER SET utf8
afterSET NAMES utf8
实际上只是撤消SET NAMES
了所做的一些工作。PHP 手册明确警告我们使用mysqli_set_charset
,而不是SET NAMES
:
这是更改字符集的首选方法。不推荐使用 mysqli_query() 设置(如 SET NAMES utf8)。有关更多信息,请参阅 MySQL 字符集概念部分。
在引擎盖下,mysqli_set_charset
它只是mysql_set_character_set
MySQL C API(或其 mysqlnd 等价物)的包装器。查看该函数的文档,我们可以看到它和之间的区别SET NAMES
:
此函数的作用类似于
SET NAMES
语句,但也设置 的值mysql->charset
,从而影响 使用的字符集mysql_real_escape_string()
换句话说,将$mysqli->set_charset('foo')
尽一切努力SET NAMES foo
并确保尊重新的编码。诚然,如果您只使用严格扩展 ASCII 的拉丁 1 和 UTF 8 之类的编码(也就是说,它们对所有 ASCII 字符串的编码与它们在 ASCII 中的编码完全相同),那么使用而不是不会破坏任何东西。但是,如果您使用更多不寻常的编码,例如 GBK,那么您最终可能会弄乱您的字符串,甚至引入绕过.mysqli_real_escape_string
SET NAMES
set_charset
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 = 连接字符串