使用MySQLi设置字符集

sys*_*bug 15 php mysqli

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

mysql_query("SET NAMES 'utf8'"); 
mysql_query('SET CHARACTER SET utf8'); 
Run Code Online (Sandbox Code Playgroud)

现在我正在使用OOP风格,所以我试图看看是否有可以设置的东西而不是上面的东西?

我只在PHP手册中找到了这个,所以我做了,但是如何将名称设置为UTF8呢?

$mysqli->set_charset("utf8");
Run Code Online (Sandbox Code Playgroud)

xda*_*azz 24

一样的:

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

从手册:

这是更改charset的首选方法.建议不要使用mysqli :: query()来执行SET NAMES ..

$mysqli->set_charset("utf8"); 就够了,让mysqli db驱动程序为你做的事情.

  • 文档说`...不推荐使用mysqli :: query()来执行SET NAMES .. http://php.net/manual/de/mysqli.set-charset.php (2认同)
  • @sys_debug 看起来你不需要做 `SET NAMES 'utf8'`,`$mysqli->set_charset("utf8")` 就足够了。 (2认同)
  • 这很令人困惑。您说要使用“SET NAMES”,然后立即说*不*使用“SET NAMES”。 (2认同)

Mar*_*ery 13

你应该用

$mysqli->set_charset("utf8");
Run Code Online (Sandbox Code Playgroud)

使用MySQLi时不要使用SET NAMESSET CHARACTER SET明确使用,当然也不要像这里的提问者一样使用这两者.这是一个坏主意的原因:

  • 调用SET CHARACTER SET utf8 后,SET NAMES utf8实际上只是撤销了一些工作SET NAMES.
  • PHP手册明确警告我们使用mysqli_set_charset,而不是SET NAMES:

    这是更改charset的首选方法.建议不要使用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不和保证mysqli_real_escape_string尊重新的编码.不可否认,如果您只使用像Latin 1和UTF 8这样的编码来严格扩展ASCII(即,所有ASCII字符串都与ASCII编码完全相同),那么使用SET NAMESset_charset不会破坏任何东西.但是,如果你使用像GBK这样的更多不寻常的编码,那么你最终可能会乱写你的字符串甚至引入绕过的SQL注入漏洞mysqli_real_escape_string.

因此,仅使用set_charset而不是使用是好的做法SET NAMES.没有什么可以SET NAMES做到这set_charset一点,并set_charset避免mysqli_real_escape_string行为不正确(甚至不安全)的风险.


小智 8

您可以使用它。对于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'");
Run Code Online (Sandbox Code Playgroud)


小智 8

对于程序风格爱好者。

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);

/* change character set to utf8 */
mysqli_set_charset($conn,"utf8");
Run Code Online (Sandbox Code Playgroud)