我用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驱动程序为你做的事情.
Mar*_*ery 13
你应该用
$mysqli->set_charset("utf8");
Run Code Online (Sandbox Code Playgroud)
使用MySQLi时不要使用SET NAMES或SET 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 NAMES而set_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)