提问人:Mike Stanford 提问时间:5/8/2009 最后编辑:Alan MooreMike Stanford 更新时间:5/10/2009 访问量:883
PHP MySQL编码错误?
PHP MySQL Encoding Bug?
问:
这是我的问题。我有一个名为quotes的mysql表。在其中一行中,引号包含以下字符
‘ and ’
现在行排序规则已utf8__unicode__ci
当使用 MySQL Query Browser 和 PHPMyAdmin 检索行时,引号会按预期出现。当我使用PHP从数据库中检索它们并将它们显示在屏幕上时,它们会以框的形式出现
� and �
我的 html 页面有 UTF-8 编码,所有的 UTF-8 编码选项都是在 php 中设置的:
/* Set UTF-8 settings */
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');
mb_http_output('UTF-8');
/* Set ICONV ini settings */
ini_set('iconv.input_encoding', 'UTF-8');
ini_set('iconv.output_encoding', 'UTF-8');
ini_set('iconv.internal_encoding', 'UTF-8');
/* Set ICONV function settings */
iconv_set_encoding('input_encoding', 'UTF-8');
iconv_set_encoding('output_encoding', 'UTF-8');
iconv_set_encoding('internal_encoding', 'UTF-8');
在我看来,它应该起作用。但事实并非如此:S 任何人都可以对此有所了解。
答:
1赞
chaos
5/8/2009
#1
你的整理对你没有帮助;它只是确定排序顺序。您需要将默认字符集设置为 utf-8,如下所示:
CREATE TABLE `foo` (
`id` int not null auto_increment,
`name` varchar(50)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
您应该能够通过以下方式解决此问题:
ALTER TABLE `foo` DEFAULT CHARSET=utf8
唯一的问题是,如果索引是 utf-8,有时它们会太长。
评论
0赞
Mike Stanford
5/8/2009
@chaos我刚刚试过了。它仍然不起作用。它与PHP有关,因为MySQL查询浏览器和PHPMyAdmin都正确显示引号。
0赞
chaos
5/8/2009
呃......你的HTTP文档编码是什么?在 Firefox 中查看>字符编码。
0赞
chaos
5/8/2009
当你通过自己的PHP显示你的数据库内容时,我的意思是;在 PHPMyAdmin 中肯定是 utf-8。
0赞
chaos
5/8/2009
好吧,我们不要等待反馈:我猜你会发现它是 ISO-8859-1,这意味着你需要告诉它是 utf-8。我最喜欢的方法是:header('Content-type: text/html; charset=utf-8');请注意,utf-8 周围缺少引号;这是一个浏览器兼容性的问题。
0赞
Mike Stanford
5/8/2009
事实证明,这是我的MySQL连接的字符集。它是 latin1 而不是 utf8。
5赞
Joakim Bodin
5/8/2009
#2
您可能需要将 UTF-8 设置为 MySQL 连接上选定的字符集。如果您使用的是 mysqli PHP 驱动程序,这意味着如下所示:
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");
$mysqli->set_charset("utf8");
评论
0赞
Petrunov
5/8/2009
查询是 SET NAMES 'utf8'
0赞
chaos
5/8/2009
我认为是 SET CHARACTER SET 实际上在为他做这件事。SET NAMES 与表/列/等标识符有关。
4赞
Mike Stanford
5/8/2009
#3
@Joakim,非常感谢你让我朝着正确的方向前进。我无法使用您的确切代码,因为我使用的是自定义数据库驱动程序,并且它使用旧的 mysql 命令而不是 mysqli 类工作。我尝试使用 mysql_set_charset(),但我的 php 版本不支持它(仍然是 php 5 tho)。
这是我使用的解决方案:
mysql_query("SET CHARACTER SET utf8", $this->connection);
mysql_query("SET NAMES utf8", $this->connection);
评论