我有以下问题:在一个非常简单的PHP mysqli的查询:
if ( $result = $mysqli->query( $sqlquery ) )
{
$res = $result->fetch_all();
$result->close();
}
我得到的编码错误西方编码串串,虽然数据库,表和列是utf8_general_ci
排序规则。 PHP脚本本身是UTF-8编码和脚本的mysql的少部分得到正确的编码 。 所以说echo "ő"
的作品完美,但echo $res[0]
从前面的例子输出EF BF BD
当文件在正确的UTF-8编码字符观看。 如果我手动切换浏览器的编码到西方,和mysqli源字符串得到良好的解码,除了非西方字符“被取代?”。
是什么使得它更奇怪的是,在我的开发环境,这是不会发生,而在我的网络服务器是。 该开发环境是LAMP堆栈(该统一服务器),而Web服务器使用nginx的。
在这种情况下, 我进入了使用phpMyAdmin数据库中的数据 ,和里面的phpmyadmin它显示完美。 phpMyAdmin的的排序是utf-8。 我认为,这个问题一定在这附近, 因为在相同的Web服务器,对于我(使用POST)同样的问题不会发生通过PHP输入数据的其他部位 。 在这种情况下,数据是可见的正确都在进入和在查看它(我的意思是在PHP中生成的网页),但特殊字符不是在phpMyAdmin正确。
你能帮我从哪里开始调试? 它是连接到PHP或MySQL或nginx的或phpMyAdmin的 ?
使用mysqli_set_charset
到客户端的编码改为UTF-8,你只连接后:
$mysqli->set_charset("utf8");
客户端编码是什么MySQL中期望的输入是在(例如,当您将用户提供的文本搜索查询),以及它给你的结果(所以它必须以匹配您的输出编码echo
,显示的东西正确)。
你需要有与之相匹配你的网页的编码,以考虑两种方案上面和 PHP源文件的编码(让您查询的硬编码部分正确的解释)。
更新:如何使用Latin-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;
占位符table_name
, column_name
和existing_column_type
应该从每次你的数据库的正确值替换。
这样做是什么
- 通知MySQL,它需要将数据存储在LATIN1该列。 该字符集只包含UTF8的一小部分所以一般这种转换涉及的数据丢失,但在这种特定情况下的数据已经被解释为对输入处理latin1所以不会有任何副作用。 然而,MySQL将在内部转换数据的字节表示匹配的内容最初是从PHP发送。
- 列转换为二进制类型(
BLOB
不具有关联的编码信息)。 此时列将包含有正确的UTF8字符串的原始字节。 - 列转换为它的前一个字符类型,告诉的MySql的原始字节应被认为是UTF8编码。
警告:如果有问题的列中只包含错误插入的数据只能用这个办法滥。 已正确插入任何数据将在任何非ASCII字符的第一次出现被截断!
因此这是一个好主意,现在就做,在PHP端修复程序生效之前。
使用的mysqli :: set_charset功能。
$mysqli->set_charset('utf8'); //returns false if the encoding was not valid... won't happen
http://php.net/manual/en/mysqli.set-charset.php
我没有用mysqli的一段时间,但如果事情是一样的,在默认情况下连接使用拉丁文瑞典编码(ISO 8859 1)。
我会考虑你的页面是通过具有已经使用utf8编码:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
内的<head>
标记。
如果您对拉美瑞典编码字符串都已经,您可以使用mk_convert_encoding:
http://php.net/manual/en/function.mb-convert-encoding.php
$fixedStr = mb_convert_encoding($wrongStr, 'UTF-8', 'ISO-8859-1');
iconv
确实非常类似的东西:说实话,我不知道其中的差别,但这里的链接功能参考: http://php.net/manual/en/function.iconv.php
我才意识到,你可能有一些UTF8字符串和其他拉美瑞典。 您可以使用mb_detect_encoding为: http://php.net/manual/en/function.mb-detect-encoding.php
您也可以转储数据库和使用的iconv(CMD线),如果你安装了它:
iconv -f latain -t utf-8 < currentdb.sql > fixeddb.sql