我正在用zend框架做一个项目,我从utf-8数据库中提取数据。该项目也是utf-8。
在表单中,我有一个显示国家/地区列表的选择元素。问题是: 在法语或西班牙语中,某些国家/地区不会显示。
在我的国家/地区列表的var_dump()之后,我看到那些是具有特殊字符的国家/地区。重音的。
在var_dump中我可以看到字符表示为?钻石。我尝试将编码更改为iso-8859-1,我可以看到特殊字符的var_dump结果就好了。为什么来自utf-8数据库的数据显示在iso-8859-1!
我可以在mysql的utf-8表中存储iso-8859-1字符集而不会出现问题吗?它不应该显示混乱的字符吗?
困惑。
-
delimiter $$
CREATE TABLE `geo_Country` (
`CountryID` int(10) NOT NULL,
`CountryName` varchar(45) NOT NULL,
`CountryCompleteName` varchar(45) NOT NULL,
`Nationality` varchar(45) NOT NULL,
`CreationDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`Status` tinyint(1) NOT NULL DEFAULT '1',
`LanguageCode` char(2) NOT NULL,
`ZoneID` int(10) NOT NULL,
PRIMARY KEY (`CountryID`,`LanguageCode`),
KEY `fk_geo_Country_web_Language1` (`LanguageCode`),
KEY `fk_geo_Country_geo_Zone` (`ZoneID`),
KEY `idx_CountryName` (`CountryName`)
CONSTRAINT `fk_geo_Country_geo_Zone` FOREIGN KEY (`ZoneID`) REFERENCES `geo_Zone` (`ZoneID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_geo_Country_web_Language1` FOREIGN KEY (`LanguageCode`) REFERENCES `web_Language` (`LanguageCode`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
答案 0 :(得分:3)
UTF-8需要记住的是:
整个应用程序中的所有内容都必须是UTF-8!
对于普通的PHP / MySQL Web应用程序(表单,发布到数据库),您需要检查是否:
SET NAMES UTF8;
)Content-Type: text/html; charset=utf8
标头,使用<meta charset="utf8">
标记(对于HTML5,对于其他HTML变体,使用<meta http-equiv="Content-Type" content="text/html; charset=utf8">
)在var_dump
的情况下,只有一些纯文本被发送到浏览器,没有提到任何字符集。查看规则#3,这意味着您的浏览器会以不同的字符集显示,大概是latin1,从而为您提供钻石/问号/块。
如果需要检查数据是否存储正确,请使用PHPMyAdmin等数据库客户端查看记录。这样您就可以将内容视为UTF-8(注意:这是PMA中的设置,因此请检查它是否设置为不同的字符集!)。
在旁注中,将数据库的文本列的排序规则设置为utf8_general_ci,这不用于存储,而是用于排序。所以这与你的问题无关,但这是一个很好的做法。
答案 1 :(得分:1)
连接数据库时,应设置cleint编码 对于Zend_Db,似乎应该是这样的(注意'driver_options'):
$params = array(
'host' => 'localhost',
'username' => 'username',
'password' => 'password',
'dbname' => 'dbname',
'driver_options' => array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8;');
);
用于application.ini
resources.db.params.charset = utf8
作为最后的手段,您可以像其他任何查询一样手动运行此查询SET NAMES UTF8
。