2011-09-16 122 views
2

找不到我無法存儲在MySQL數據庫字符如ţ,,,ş的原因。不能在MySQL中存儲UTF8字符

我的表的定義是:

CREATE TABLE IF NOT EXISTS `gen_admin_words_translated` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `word_id` int(10) NOT NULL, 
    `value` text COLLATE utf8_unicode_ci, 
    `lang_id` int(2) NOT NULL, 
    `needUpd` int(1) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2689 ; 

到數據庫的連接是用下面的腳本來完成:

$charset = "UTF8"; 
$link = mysql_connect($host, $user, $pass); 
if(!$link){ 
    die("Unable to connect to database server."); 
} 
mysql_selectdb($database); 
if(function_exists("mysql_set_charset")){ 
    mysql_set_charset($charset, $link); 
}else{ 
    mysql_query("SET NAMES $charset"); 
} 

我對頁面的頭部:

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

和腳本是:

$text = 'ţ, î, ş'; 
mysql_query("insert into gen_admin_words_translated (word_id, lang_id, value, needUpd) values (1, 1, '$text', 1)"); 

所有我在表到底得的是:

SELECT * FROM `gen_admin_words_translated` 

id word_id value lang_id needUpd 
5166 1034 ?, 1  1 
+1

由於您試圖插入字符文字...您的腳本的文本編碼(保存在磁盤上)也是UTF-8? – Jon

+0

@Jon:我該如何檢查?我在服務器上運行腳本,而不是在本地運行。 – CristiC

+0

取決於您的編輯器,但您也可以執行快速和骯髒的檢查:將字符'€'添加到您的文件並保存。如果文件大小更改爲1或2個字節而不是3個,則表示不在UTF-8上。 – Jon

回答

3

擴大我的意見到一個答案:

看來你正確設置了東西,只停留在插入一個字符串到數據庫中。要做到這一點,您還必須確保您保存的PHP腳本的文本編碼也是UTF-8

大多數體面的編輯會讓你知道你當前正在使用哪種編碼,並且還可以在不同的編碼之間進行存儲(即轉換)(即使是今天的記事本也是如此)。但是,作爲快速檢查,您可以將文字添加到您的文件並保存。如果文件大小更改爲1或2個字節而不是3個,則您不在UTF-8上,並且需要將該文件轉換爲該編碼。

除此之外,當從瀏覽器接收到文本作爲輸入時,你的代碼應該處理它就好了。

注:邊使用<meta>標籤設置編碼爲您的網頁應該是足夠的,這是更好,如果你這樣做從PHP這樣的HTTP標頭:

header('Content-type: text/html; charset=utf-8'); 
+0

謝謝喬恩。我花了一個多小時處理這樣一件愚蠢的事情。事實上,我的即興編輯並未使用UTF-8編碼。 – CristiC

3

我跑你的腳本,它的工作對我來說:

$charset = "UTF8"; 
$link = mysql_connect('localhost', 'root', '') or die('connection?'); 
mysql_select_db('test') or die('database?'); 
if(function_exists("mysql_set_charset")){ 
    mysql_set_charset($charset, $link); 
}else{ 
    mysql_query("SET NAMES $charset"); 
} 

$text = 'ţ, î, ş'; 
mysql_query("insert into gen_admin_words_translated (word_id, lang_id, value, needUpd) values (1, 1, '$text', 1)"); 

$query = mysql_query('SELECT * FROM `gen_admin_words_translated`'); 
$array = mysql_fetch_array($query); 

print_r($array) 

結果:

Array 
(
    [0] => 2689 
    [id] => 2689 
    [1] => 1 
    [word_id] => 1 
    [2] => ţ, î, ş 
    [value] => ţ, î, ş 
    [3] => 1 
    [lang_id] => 1 
    [4] => 1 
    [needUpd] => 1 
) 

東西檢查:

檢查如果你的網頁真的是UTF-8,也許你有一些chaset設置另一個地方。

header('Content-type: text/html; charset=utf-8'); 

文件的編碼方式也應該是UTF-8,因爲它可能否則打斷你的角色..

+1

他的網頁編碼與MySql無關。 – Jon

+0

他的網頁編碼與插入有關,如果頁面不是UTF8,則字符甚至不會訪問數據庫。嘗試打開記事本,鍵入這些字符並將其關閉爲ANSI,您會看到它打破了字符。 –

+0

對不起,我的錯誤不是確切的。我的意思是*他現在正在嘗試的*(不起作用)與他的網頁無關。另外,他有一個'meta'標籤,雖然不理想,但它應該足以滿足瀏覽器的需求。 – Jon

1

是否最後的結果你粘貼來自mysql命令行?如果有,請SET NAMES utf8;查詢SELECT * FROM gen_admin_words_translated

+2

他已經這麼做了。你讀過代碼了嗎? (我可以對upvoter說同樣的話) – Jon

+0

是的,他這樣做了,但只在PHP代碼中,對吧?我不確定的是他使用MySQL命令行或其他工具來執行SELECT查詢。 – robhsiao

2

如果在此之前:

$text = 'ţ, î, ş'; 

是你的文字代碼,你需要確保的是,PHP源文件編碼爲UTF-8,以及。否則,這些字符在Unicode上下文中將是ISO-8859-1字符,導致字符被破壞。

$text = 'ţ, î, ş'; 

然而,他們將使用PHP文件的字符編碼進行編碼:

+0

謝謝。這是問題。我接受了喬恩的答案,因爲他是第一位向我指出解決方案的人。 – CristiC

1

在這份聲明中,因爲他們在當前的PHP文件中存在要插入字符。除非此PHP文件本身使用UTF-8編碼,否則結果字符串將不會使用UTF-8編碼。

您應該使用文本編輯器來檢查當前文件上使用的字符編碼。所有正派的文本編輯器都應該能夠顯示文檔中使用的字符編碼,並且可以轉換其中的字符編碼。

要創建更可移植的代碼,以確保您的文檔的字符編碼也沒關係,你可以用編碼值是這樣的:不幸的是

$text = "\xC5\xA3, \xC3\xAE, \xC5\x9F"; 

,如果你做了很多這樣它的因爲你必須使用多字節十六進制表示法 - PHP沒有像其他一些語言一樣指定字符的原生Unicode方式(可以去「\ u163」而不是「\ xC5 \ xA3」 )。

您可以使用tools like this查找十六進制中的UTF-8表示形式。

1

檢查你的MySQL初始化文件。它應該包括這些字符集行:

[client] 
port=3306 

[mysql] 
default-character-set=utf8 
port = 3306 
# 
[mysqld] 
basedir="..... 
#Path to the database root 
datadir="..... 
# The default character set that will be used when a new schema or table is 
# created and no character set is defined 
character-set-server=utf8 
相關問題