我正在使用 MySQLi 从 MySQL 表中获取阿拉伯语数据。所以我通常以程序风格使用它:
mysql_query("SET NAMES 'utf8'");
mysql_query('SET CHARACTER SET utf8');
现在我使用的是OOP风格,所以我想看看是否有什么我可以设置而不是上面的?
我只在 PHP 手册中找到了这个,所以我这样做了,但是将名称设置为 UTF8 怎么样?
$mysqli->set_charset("utf8");
来自手册:
这是更改字符集的首选方法。使用 mysqli::query() 不建议执行 SET NAMES ..。
$mysqli->set_charset("utf8mb4");
就足够了,让 mysqli 数据库驱动程序为你做这件事。
你应该使用
$mysqli->set_charset("utf8mb4");
使用 MySQLi 时,不要明确使用 SET NAMES
或 SET CHARACTER SET
,当然也不要像提问者最初那样使用两者。这是一个坏主意的原因:在
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
,我们可以看到它和
SET NAMES
之间的区别:
此函数的工作方式类似于
SET NAMES
语句,但也设置 mysql->charset
的值,从而影响
mysql_real_escape_string()
使用的字符集换句话说,$mysqli->set_charset('foo')
将执行
SET NAMES foo
所做的一切,并且
也确保
mysqli_real_escape_string
遵循新的编码。诚然,如果您只使用严格扩展 ASCII 的 Latin 1 和 UTF 8 之类的编码(即,对所有 ASCII 字符串进行完全按照 ASCII 编码的方式进行编码),那么使用 SET NAMES
而不是 set_charset
就不会了。不要破坏任何东西。但是,如果您使用 GBK 等更不寻常的编码,那么您最终可能会弄乱字符串,甚至引入绕过 mysqli_real_escape_string
的SQL 注入漏洞。 因此,最好只使用
set_charset
SET NAMES
。
SET NAMES
所做的一切都是 set_charset
不做的,并且 set_charset
避免了 mysqli_real_escape_string
行为不正确(甚至不安全)的风险。对于程序风格爱好者。
你可以用这个。对于 mysqli 字符集来说真的很好
mysqli_query($conn,"SET NAMES 'latin5'");