2013-07-03 41 views
1

不知道爲什麼會發生,環境肯定有問題。 我已經分貝聲明什麼可能會導致問號而不是非ASCII符號?

CREATE DATABASE `mydb` /*!40100 DEFAULT CHARACTER SET latin1 */ 

然後,我有一個表聲明爲

CREATE TABLE `myabstract_table` (
    `key_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `varchar_field` varchar(128) NOT NULL 
    PRIMARY KEY (`key_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

然後我通常這種情況下PHP代碼:

function execSQL($conn, $sql, $values = false) { 
    try { 
    $stmt = $conn->prepare($sql); 
    if ($values) 
     foreach($values as $param=>$value) 
     $stmt->bindValue($param, $value); 
     if (! $stmt->execute()) { 
     error_log ("PDO Error: ".json_encode($stmt->errorInfo())); 
     return false; 
     } 
    } catch (PDOException $e) { 
     error_log ("Exception: " . $e->getMessage()); 
     return false; 
    } 
    return $stmt; 
} 

,之後的字符串用保存(通過INSERT語句)db用代替非ASCII符號

PS。我在執行任何sql請求之前執行set names 'utf8',所有php的東西都被配置爲UTF-8,html文檔頭包含帶UTF-8的元標記,並被規定爲字符集; 我沒有嘗試的唯一的事情就是改變模式本身的默認字符集(它目前是latin1),因爲我很確定它沒有問題。或者是?

enter image description here

+0

這一切都是因爲整理使用'utf8_general_ci'無處不在。 –

+1

@Yogesh校對與* encoding *不同,他已經使用'utf8'作爲編碼了! – deceze

+1

您的數據是否以UTF-8編碼?請參閱[在Web應用程序中處理Unicode前後](http://kunststube.net/frontback/)。 – deceze

回答

2

好的,我找到了原因。還有一點我忘了提及。它是存儲過程。此過程插入的行不正常INSERT權利從PHP。

我認爲,默認模式字符集影響程序IN varchars參數聲明沒有顯式字符集。我終於做到以下幾點:

CREATE PROCEDURE `sp_myabstract_proc`(
    `prm_key_id` int(10), 
    `prm_varchar_param` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci 
) 
BEGIN 
-- some insert logic here 
END; 

CHARACTER SET utf8選項做的伎倆) 所以在我的情況下,MySQL的引擎與prm_varchar_param處理與LATIN1從架構屬性繼承。

+1

所以它看起來像數據庫字符集*做*意味着什麼@YourCommonSense;) –

0

您需要的字符集的數據庫更改爲UTF-8或Cyrillic characters的字符集。

Latin-1無法編碼西里爾文字符,這就是爲什麼它們在數據庫中顯示爲問號。

編輯:我剛纔看到你聲明瞭UTF-8字符集的表,所以我很難過。

+0

數據集字符集意味着什麼。 –

+1

因此編輯:) –

相關問題