MySQL在UTF-8PHP文件中输出西方编码
我有以下问题:在一个非常简单的php mysqli查询上:MySQL在UTF-8PHP文件中输出西方编码,php,mysql,nginx,phpmyadmin,mysqli,Php,Mysql,Nginx,Phpmyadmin,Mysqli,我有以下问题:在一个非常简单的php mysqli查询上: if ( $result = $mysqli->query( $sqlquery ) ) { $res = $result->fetch_all(); $result->close(); } 虽然数据库、表和列都在utf8\u general\u cicollation中,但我将字符串错误地编码为西方编码字符串。php脚本本身是utf-8编码的,mysql-less部分得到了正确的编码。因此,假设ec
if ( $result = $mysqli->query( $sqlquery ) )
{
$res = $result->fetch_all();
$result->close();
}
虽然数据库、表和列都在utf8\u general\u ci
collation中,但我将字符串错误地编码为西方编码字符串。php脚本本身是utf-8编码的,mysql-less部分得到了正确的编码。因此,假设echo“ő”
工作正常,但是前面示例中的echo$res[0]
在以正确的UTF-8编码查看文件时输出EF BF BD
字符。如果我手动将浏览器的编码切换到西方,mysqli来源的字符串将得到良好的解码,除了非西方字符被替换为“?”之外
更奇怪的是,在我的开发环境中,这种情况并没有发生,而在我的Web服务器上却发生了。开发人员环境是一个LAMP堆栈(统一服务器),而Web服务器使用nginx
在本例中,我使用phpMyAdmin在数据库中输入数据,在phpMyAdmin内部它显示得非常完美。phpMyAdmin的排序规则也是utf-8。我相信问题一定在这里附近的某个地方,就像在同一个Web服务器上一样,对于我通过php输入数据的其他站点(使用POST)同样的问题不会发生。在这种情况下,数据在输入和查看时都正确可见(我的意思是在php生成的网页中),但在phpMyAdmin中特殊字符不正确
你能帮我从哪里开始调试吗?它是否连接到php或mysql或nginx或phpMyAdmin?使用mysqli::set\u charset函数
$mysqli->set_charset('utf8'); //returns false if the encoding was not valid... won't happen
我已经有一段时间没有使用mysqli了,但如果情况相同,连接默认使用拉丁-瑞典语编码(iso8859-1)
<>我会考虑你的页面已经使用了UTF8编码:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
iconv
做了一些非常相似的事情:说实话,我不知道有什么不同,但这里是函数引用的链接:
我刚刚意识到你可能有一些utf8格式的字符串,还有一些是拉丁瑞典语。你可以使用mb_detect_编码:
如果安装了iconv(命令行),还可以转储数据库并使用iconv:
iconv -f latain -t utf-8 < currentdb.sql > fixeddb.sql
iconv-f latain-t utf-8fixeddb.sql
用于在连接后将客户端编码更改为UTF-8:
$mysqli->set_charset("utf8");
客户机编码是MySql希望您输入的内容(例如,在搜索查询中插入用户提供的文本时)和它给您结果的内容(因此它必须匹配您的输出编码,以便echo
正确显示内容)
您需要让它与web页面的编码匹配,以说明上述两种情况和PHP源文件的编码(以便正确解释查询的硬编码部分)
更新:如何将使用拉丁语-1插入的数据转换为utf-8
对于已使用错误连接编码插入的数据,有一个方便的解决方案可以解决此问题。对于包含此类数据的每列,您需要执行以下操作:
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET latin1;
ALTER TABLE table_name MODIFY column_name BLOB;
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET utf8;
每次都应使用数据库中的正确值替换占位符表名
、列名
和现有列类型
它的作用是
BLOB
)。此时,该列将包含正确的utf8字符串的原始字节因此,在PHP端修复程序生效之前,立即执行此操作是一个好主意。尽管不熟悉mysqli:PHP头是否告诉浏览器正确的编码?谢谢,它可以工作!您能给出任何指针,说明如何在仍然使用原始编码的情况下转换从PHP填充的数据库内容吗?谢谢非常,非常高兴看到不使用PHP就可以进行转换!感谢它的工作!您能给出任何指针如何在仍然使用原始编码的情况下转换从PHP填充的数据库内容吗?
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET latin1;
ALTER TABLE table_name MODIFY column_name BLOB;
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET utf8;