簡體   English   中英

mysql,php-字符編碼問題`

[英]mysql, php - character encoding problem`

我正在使用zend框架進行項目,並且正在從utf-8數據庫中提取數據。 該項目也是utf-8。

在表單中,我有一個select元素,用於顯示國家/地區列表。 問題是:在法語或西班牙語中,沒有顯示某些國家。

在完成我的國家列表的var_dump()之后,我看到那些是具有特殊字符的國家。 有口音的。

在var_dump中,我可以看到以?表示的字符。 在鑽石中。 我嘗試將編碼更改為iso-8859-1,我可以看到帶有特殊字符的var_dump結果很好。

來自utf-8數據庫的數據如何在iso-8859-1中顯示!

我可以將iso-8859-1字符集存儲在mysql的utf-8表中嗎? 它不應該顯示混亂的字符嗎?

困惑。

-

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$$

使用UTF-8時要記住的是:

您整個應用程序中的所有內容都必須為UTF-8!

對於普通的PHP / MySQL Web應用程序(表單,發布到數據庫),您需要檢查:

  1. 您的數據庫連接使用UTF-8(在建立連接后立即執行此查詢: SET NAMES UTF8;
  2. 您的PHP代碼使用UTF-8。 這意味着無需使用字符集轉換/編碼功能(當一切都為UTF-8時無需使用)。
  3. 通過發送Content-Type: text/html; charset=utf8 ,您的HTML輸出為UTF-8 Content-Type: text/html; charset=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,這不是用於存儲,而是用於排序。 因此,這與您的問題無關,但是這樣做是一個好習慣。

連接數據庫時,應設置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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM