19

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

mysql_query("SET NAMES 'utf8'"); 
mysql_query('SET CHARACTER SET utf8'); 

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

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

$mysqli->set_charset("utf8");
4

5 回答 5

26

一样的:

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

从手册:

这是更改字符集的首选方法。不推荐使用 mysqli::query() 来执行 SET NAMES ..。

$mysqli->set_charset("utf8");就够了,让mysqli db驱动为你做这件事。

于 2012-05-31T08:24:12.783 回答
14

你应该使用

$mysqli->set_charset("utf8");

使用 MySQLi 时不要使用SET NAMESSET CHARACTER SET显式使用。当然也不要像这里最初的提问者那样使用两者。这是一个坏主意的原因:

  • 调用SET CHARACTER SET utf8 afterSET NAMES utf8实际上只是撤消SET NAMES了所做的一些工作
  • PHP 手册明确警告我们使用mysqli_set_charset,而不是SET NAMES

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

  • 在引擎盖下,mysqli_set_charset只是mysql_set_character_setMySQL C API(或其 mysqlnd 等价物)的包装器。查看该函数的文档,我们可以看到它和之间的区别SET NAMES

    此函数的作用类似于SET NAMES语句,但也设置 的值mysql->charset,从而影响 使用的字符集mysql_real_escape_string()

    换句话说,$mysqli->set_charset('foo')尽一切努力SET NAMES foo并确保尊重新的编码。诚然,如果您只使用严格扩展 ASCII 的拉丁 1 和 UTF 8 之类的编码(也就是说,它们对所有 ASCII 字符串的编码与它们在 ASCII 中的编码完全相同),那么使用而不是不会破坏任何东西。但是,如果您使用更多不寻常的编码,例如 GBK,那么您最终可能会弄乱您的字符串,甚至引入绕过.mysqli_real_escape_stringSET NAMESset_charsetmysqli_real_escape_string

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

于 2016-05-02T13:12:07.503 回答
12

你可以使用这个。它非常适合 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'");
于 2017-10-24T15:39:55.260 回答
9

对于程序风格爱好者。

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

/* change character set to utf8 */
mysqli_set_charset($conn,"utf8");
于 2017-11-21T09:56:09.213 回答
-1
mysqli_query($conn,"SET NAMES 'latin5'");

$conn = 连接字符串

于 2016-05-02T10:43:23.633 回答