通过远程数据库连接utf8返回的不同字符比本地连接

时间:2013-06-05 16:42:02

标签: php mysql utf-8

我正在尝试通过远程mysql数据库连接检索外语UTF8数据。当我远程检索数据时,utf8无法在浏览器中正确显示。但是,当我通过本地数据库连接(在实时站点和本地测试计算机上)检索数据时,字符在浏览器中正确显示。

我的远程连接是从本地服务器到在线实时网站。

对于我设置的每个页面:

header('Content-Type: text/html; charset=utf-8');

我也试过设置UTF-8元标记。我还将.htaccess中指定的UTF8作为默认字符集。

这是一个较旧的网站,所以我仍在使用mysqli。我也尝试过设置:

$mysqli->set_charset("utf8");

例如,通过远程连接,Français出现为Français。

我不知道该怎么做。我花了好几个小时试图搞清楚,但无济于事。我知道要求代码是常态,但是代码太多,我不能在这里包含所有内容。

谢谢!

2 个答案:

答案 0 :(得分:1)

您的解决方案是:在远程数据库the data is encoded to utf8 twice上,产生不正确的结果。您的代码没有问题,该数据库有问题。您可以在那里修复它(如果它是varchar,首先进行备份!):首先将其转换为latin1,然后转换为二进制转换为utf8。一个工作的sql小提示,告诉你如何here,我也会在这里粘贴代码,以防sqlfiddle将来在某处删除它:

-- database column correctly defined as utf8
CREATE TABLE base (col VARCHAR(128) CHARSET utf8);
-- wrong data is entered:
INSERT INTO base SELECT UNHEX('4672616EC383C2A7616973');
-- first, convert back to latin-1, we have now proper utf-8 data, but in a latin1 column
ALTER TABLE base MODIFY COLUMN col VARCHAR(128) CHARSET latin1;
-- convert to binary first, so MySQL leaves the bytes as is without conversion
ALTER TABLE base MODIFY COLUMN col VARBINARY(128);
-- then convert to the proper character set, which will leave the bytes once again intact
ALTER TABLE base MODIFY COLUMN col VARCHAR(128) CHARSET utf8;

答案 1 :(得分:0)

我通过将以下内容添加到调用远程数据库的脚本中来实现它:

$mysqli->set_charset("latin1");

我不知道它是否有点像黑客,因为它仍然意味着字符可能没有正确编码或整理,但它的工作原理。感谢Wrikken向我展示了字符集修改,我可以尝试在将来使用它们来正确地纠正这些内容。