我在阿拉伯语从MySQLi的MySQL表获取数据。 所以我通常在程序风格使用:
mysql_query("SET NAMES 'utf8'");
mysql_query('SET CHARACTER SET utf8');
现在,我使用的是面向对象的风格,所以我想看看是否有什么我可以设置,而不是上面?
我只找到这个PHP手册中,所以我做到了,但有关名称设置为UTF-8呢?
$mysqli->set_charset("utf8");
我在阿拉伯语从MySQLi的MySQL表获取数据。 所以我通常在程序风格使用:
mysql_query("SET NAMES 'utf8'");
mysql_query('SET CHARACTER SET utf8');
现在,我使用的是面向对象的风格,所以我想看看是否有什么我可以设置,而不是上面?
我只找到这个PHP手册中,所以我做到了,但有关名称设置为UTF-8呢?
$mysqli->set_charset("utf8");
一样的:
$ mysqli->查询( “集名称 'UTF8'”);
从手册:
这是改变字符集的首选方式。 不推荐使用的mysqli ::查询()执行SET NAMES ..。
$mysqli->set_charset("utf8");
仅仅是不够的,让mysqli的DB驱动程序做的事你。
您应该使用
$mysqli->set_charset("utf8");
不要使用SET NAMES
或SET CHARACTER SET
使用的MySQLi时明确,肯定不喜欢这个问题提问者在这里使用这两个原本是。 原因这是一个坏主意:
SET CHARACTER SET utf8
后SET 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
不也确保mysqli_real_escape_string
尊重新的编码。 诚然,如果你只使用像拉丁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
行为不当(甚至不安全的)。
您可以使用此。 它真的很好了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'");
$康恩=连接字符串