Php 使用MySQLi设置字符集

Php 使用MySQLi设置字符集,php,mysqli,Php,Mysqli,我正在使用MySQLi从MySQL表中获取阿拉伯语数据。所以我通常在程序风格中使用: mysql_query("SET NAMES 'utf8'"); mysql_query('SET CHARACTER SET utf8'); 现在我正在使用OOP风格,所以我试图看看是否有什么东西可以设置,而不是上面提到的 我只在PHP手册中找到了它,所以我就这么做了,但是将名称设置为UTF8怎么样 $mysqli->set_charset("utf8"); 是一样的: $mysqli->que

我正在使用MySQLi从MySQL表中获取阿拉伯语数据。所以我通常在程序风格中使用:

mysql_query("SET NAMES 'utf8'"); 
mysql_query('SET CHARACTER SET utf8'); 
现在我正在使用OOP风格,所以我试图看看是否有什么东西可以设置,而不是上面提到的

我只在PHP手册中找到了它,所以我就这么做了,但是将名称设置为UTF8怎么样

$mysqli->set_charset("utf8");
是一样的:

$mysqli->query(“设置名称‘utf8’”)

来自手册:

这是更改字符集的首选方法。使用mysqli::query() 要执行集合名称。。不建议使用

$mysqli->set_字符集(“utf8”)就足够了,让mysqli数据库驱动程序为您做这件事吧

mysqli_query($conn,"SET NAMES 'latin5'");
$conn=您应该使用的连接字符串

$mysqli->set_charset("utf8");
在使用MySQLi时,不要显式地使用
设置名称
设置字符集
,当然也不要像提问者最初那样同时使用这两个名称。这是一个坏主意的原因:

  • SET NAMES utf8
    之后调用
    SET CHARACTER SET utf8
    ,实际上就是这样
  • 使用
    mysqli\u set\u字符集而不是
    集合名称的PHP手册:

    这是更改字符集的首选方法。不建议使用mysqli_query()来设置它(如set NAMES utf8)。有关更多信息,请参阅MySQL字符集概念部分

  • 在引擎盖下,
    mysqli\u set\u charset
    来自MySQL C API(或其mysqlnd等价物)。查看,我们可以看到它与设置名称之间的区别:

    此函数与
    SET NAMES
    语句类似,但也设置
    mysql->charset
    的值,从而影响
    mysql\u real\u escape\u string()使用的字符集。

    换句话说,
    $mysqli->set\u charset('foo')
    将完成
    set NAMES foo
    所做的一切,并确保
    mysqli\u real\u escape\u string
    尊重新的编码。诚然,如果您只使用拉丁语1和UTF 8等严格扩展ASCII的编码(也就是说,对所有ASCII字符串的编码与ASCII编码完全相同),那么使用
    集合名称
    而不是
    集合字符集
    不会破坏任何内容。然而,如果您使用的是更不寻常的编码,比如GBK,那么最终可能会混淆字符串,甚至引入


因此,最好只使用
set\u字符集
,而不使用
集合名称
。没有任何东西是
SET name
做的而
SET\u charset
做不到的,而且
SET\u charset
避免了
mysqli\u real\u escape\u 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");

那么,我应该保留我在PHP手册中找到的内容+您在这里看到的内容,还是只保留一个就足够了?文档中说,
…使用mysqli::query()执行集合名。。不推荐使用。
@sys\u debug看起来您不需要执行
设置名称“utf8”
$mysqli->SET\u字符集(“utf8”)
就足够了。这很让人困惑。你说要使用
集合名称
,然后马上说不要使用
集合名称
。请注意
mysqli\u SET\u charset
也存在于过程样式中-使用mysqli的过程样式和OOP样式的实际功能或行为没有区别。还要注意,在这里明确使用
集合名称
集合字符集
在这两种样式中都是错误的;始终首选
mysqli\u set\u charset
(或其OOP等价物)。不要将
mysql\u*
mysqli\u*
接口混合使用。不要使用不推荐使用的(在PHP 5.7中删除的)
mysql*
函数。尽管这段代码可能会回答这个问题,但提供关于为什么和/或如何回答这个问题的额外上下文将显著提高其长期价值。请在您的答案中添加一些解释。请不要使用die()报告错误。看,我在过去7年里一直在使用这种方法。所以你应该先向我学习,然后对我的答案发表评论。非常感谢。