2013-01-05 106 views
0

我試圖將一個字表保存到我的數據庫。 Wordlist是一個utf-8編碼的文本文檔。這是我的桌子結構;mysql字符編碼與土耳其文

CREATE TABLE IF NOT EXISTS `wordlist` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `kelime` char(64) COLLATE utf8_turkish_ci NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `kelime` (`kelime`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=1140209 ; 

這裏是添加單詞的php代碼;

<?php 
ini_set('max_execution_time', 3000); 
$handle = @fopen("wordlist.txt", "r"); 

if ($handle) { 
    include("ekle.php"); // makes db connection 
    $sql = "insert into wordlist (kelime) VALUES (?)"; 
    $dbh->beginTransaction(); 
    $sth = $dbh->prepare($sql); 
    while (($buffer = fgets($handle, 4096)) !== false) { 
     $sth->execute(array(trim($buffer))); 
    } 
    if (!feof($handle)) { 
     echo "Error: unexpected fgets() fail\n"; 
     $dbh->rollBack(); 
    } else { 
     $dbh->commit(); 
    } 
    fclose($handle); 
}?> 

我的數據庫的默認排序規則也是utf-8_turkish_ci。當我添加單詞時,我的單詞列表在phpmyadmin上看起來不正確; enter image description here

我在這裏做錯了什麼?

+0

嘗試將所有內容放入utf8(數據庫,連接到db)。看到這[鏈接](http://stackoverflow.com/questions/14083847/accented-characters-in-utf-8-mysql-table-output/14083925#14083925)。 – Vucko

+0

你從來沒有告訴php/pdo,mysql的連接應該是utf-8,所以它可能默認爲iso8859-1或其他東西,並且破壞了你的文本。整個管道必須是utf8才能完成這種工作。瀏覽器<-> php <-> mysql。如果任何一個單獨的階段都是不同的字符集,而沒有適當的字符集翻譯例程,則最終會產生垃圾。 –

回答

2

我已經在我過去的經驗面對這個問題,我解決了與以下這些步驟,

第1步:設置爲UTF-8字符集head部分

首先,瀏覽器需要知道您要在此頁面中顯示或使用Unicode。因此,請轉到您的部分並將字符集設置爲utf-8。因此,瀏覽器將能夠順利顯示Unicode文本而不會出現任何錯誤。您還可以複製並粘貼下面的一行:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

第2步:創建數據庫

當您創建(一)在數據庫和(b)任何表數據庫,將它們兩者的排序規則設置爲utf8_unicode_ci,並且您知道使用phpMyAdmin會非常容易。

第3步:數據庫初始化

當初始化數據庫連接,請加「額外線」

<?php 

    define('HOSTNAME', 'localhost'); 
    define('USERNAME', 'database_user_name'); 
    define('PASSWORD', 'database_password'); 
    define('DATABASE', 'database_name'); 

    $dbLink = mysql_connect(HOSTNAME, USERNAME, PASSWORD); 
    mysql_query("SET character_set_results=utf8", $dbLink); 
    mb_language('uni'); 
    mb_internal_encoding('UTF-8'); 
    mysql_select_db(DATABASE, $dbLink); 
    mysql_query("set names 'utf8'",$dbLink); 

?> 

但是,爲什麼要補充額外的線路?因爲你正在讓數據庫很快知道你將要使用什麼類型的輸入。

第4步:INSERTING輸入/數據庫中的數據

<?php 

    mysql_query("SET character_set_client=utf8", $dbLink); 
    mysql_query("SET character_set_connection=utf8", $dbLink); 

    $sql_query = "INSERT INTO 
    TABLE_NAME(field_name_one, field_name_two) 
    VALUES('field_value_one', 'field_value_two')"; 
    mysql_query($sql_query, $dbLink); 

?> 

爲什麼要補充的前兩行?因爲數據庫應該知道要存儲什麼樣的數據。

第五步:UPDATING輸入/數據庫中的數據

<?php 

    mysql_query("SET character_set_client=utf8", $dbLink); 
    mysql_query("SET character_set_connection=utf8", $dbLink); 

    $sql_query = "UPDATE TABLE_NAME 
    SET field_name_one='field_value_one', field_name_two='field_value_two' 
    WHERE id='$id'; "; 
    mysql_query($sql_query, $dbLink); 

?> 

所以,你在運行查詢字符串之前因爲你是使用Unicode打添加額外的兩行。

第6步:中搜索數據從數據庫

<?php 

    mysql_query("SET character_set_results=utf8", $dbLink); 

    $sql_query = "SELECT * FROM TABLE_NAME WHERE id='$id'; "; 
    $dbResult = mysql_query($sql_query, $dbLink); 

?> 

添加一個額外的行每次搜索您的Unicode數據就足夠了。

就是這樣你幾乎完成了。

我認爲這可能會幫助您解決您的問題。