Php 使用MySQLi设置字符集
我正在使用MySQLi从MySQL表中获取阿拉伯语数据。所以我通常在程序风格中使用: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
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年里一直在使用这种方法。所以你应该先向我学习,然后对我的答案发表评论。非常感谢。