我有一个关于正确使用$mysqli->set_charset()
的问题。我已经很多年没有在我的网站上使用这个功能了。现在我正在重写我的连接脚本,并希望正确地应用$mysqli->set_charset()
。目前网站仍然基于'latin 1'(但我很快就会切换到UTF-8(utf8 mb 4))。
我的服务器上的MySQLi(我自己管理)已经用latin 1配置了很多年了。我想现在添加这个$mysqli->set_charset("latin1")
不会有什么坏处吧?
如果MySQLi默认配置为utf8 mb 4,如果没有$mysqli->set_charset()
函数,我的网站上会出现奇怪的编码字符,这是真的吗?
我想确认一下我的假设。
2条答案
按热度按时间ukxgm1gy1#
mysqli::set_charset()
set是 *connection的 * charset,也就是“我通过这个连接发送的所有字符串都将使用 this 编码,并且我也希望返回该编码”。您需要将其与您在PHP端使用的编码匹配 *。也就是说,即使当前的设置是错误的,如果你改变它的当前值,你也可能会得到损坏的数据。这是因为在某些情况下,只要设置是一致的,从你的数据库传输到你的数据库的数据会以同样的方式被损坏。
在进行任何更改之前,您需要确定当前使用的编码,以及数据库中的数据是否损坏。从那里您可以确定一条路径,以确保所有编码匹配,数据正确编码并在所有步骤中处理,以及修复现有数据。
和往常一样,请参阅masterpost:UTF-8 all the way through
额外的想法:
latin1
实际上是ISO-8859-1,但要注意它是邪恶的双胞胎cp 1252,它在保留器8X和9 X字节范围内填充了额外的符号,特别是€。ktca8awb2#
这很简单。将
mysqli_set_charset()
设置为您希望数据编码的值。因此,如果表的列中的数据存储在utf8mb4
中,则使用该字符集进行连接。您不能在mysqli中设置默认字符集。mysqli扩展实际上将使用MySQL为其客户端提供的默认值。该值可以在我的.cnf文件中配置。这就是为什么建议始终使用
mysqli_set_charset()
设置字符集。除非您正在处理一些遗留数据库,否则始终将字符集设置为utf8mb4
,它涵盖了最广泛的字符范围。