mysql,php - 字符编码问题

时间:2011-04-15 11:05:58

标签: php mysql character-encoding

我正在用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$$

2 个答案:

答案 0 :(得分:3)

UTF-8需要记住的是:

整个应用程序中的所有内容都必须是UTF-8!

对于普通的PHP / MySQL Web应用程序(表单,发布到数据库),您需要检查是否:

  1. 您的数据库连接使用UTF-8(在建立连接后立即执行此查询:SET NAMES UTF8;
  2. 您的PHP代码使用UTF-8。这意味着不使用字符集转换/编码功能(当所有内容都是UTF-8时都不需要)。
  3. 您的HTML输出为UTF-8,通过发送Content-Type: text/html; charset=utf8标头,使用<meta charset="utf8">标记(对于HTML5,对于其他HTML变体,使用<meta http-equiv="Content-Type" content="text/html; charset=utf8">
  4. 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