使用MySQLi设置字符集

问题描述 投票:0回答:5

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

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

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

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

$mysqli->set_charset("utf8");
php mysqli
5个回答
28
投票

来自手册:

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

$mysqli->set_charset("utf8mb4");
就足够了,让 mysqli 数据库驱动程序为你做这件事。


16
投票

你应该使用

$mysqli->set_charset("utf8mb4");
使用 MySQLi 时,不要明确使用

SET NAMESSET 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 C API(或其mysqlnd等效项)中

    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
行为不正确(甚至不安全)的风险。
    
对于程序风格爱好者。


14
投票

你可以用这个。对于 mysqli 字符集来说真的很好

13
投票

mysqli_query($conn,"SET NAMES 'latin5'");

-1
投票
	

© www.soinside.com 2019 - 2024. All rights reserved.