2012-02-23 14 views
40

今日だけUTF8にUTF8テーブルの上にlatin1の文字を変換します列も "utf8_unicode_ci"です。私のPHPスクリプトにはmb_internal_encoding('UTF-8');があり、私のすべてのPHPファイルはUTF-8としてエンコードされています。MySQLの私は、私は私のPHPスクリプトでこれを欠けていたことに気づい

だから、今まで、私は発音区別記号付きの何か、例えば、 "INSERT" 毎回:

mysql_query('INSERT INTO `table` SET `name`="Jáuò Iñe"'); 

'名前' の内容は、この場合には、次のようになります。Jáuò Iñe

PHPとMySQLの間で文字セットを修正したので、新しいINSERTが正しく格納されるようになりました。しかし、私は現時点で "混乱している"古い行をすべて修正したい。私はすでに多くのことを試みましたが、最初の "違法な"文字の文字列はいつも壊れています。ここに私の現在のコードは次のとおりです。

$m = mysql_real_escape_string('¿<?php echo "¬<b>\'PHP &aacute; (á)ţăriîş </b>"; ?> ă-ţi abcdd;//;ñç´พดแทฝใจคçăâξβψδπλξξςαยนñ ;'); 
mysql_set_charset('utf8'); 
mysql_query('INSERT INTO `table` SET `name`="'.$m.'"'); 
mysql_set_charset('latin1'); 
mysql_query('INSERT INTO `table` SET `name`="'.$m.'"'); 
mysql_set_charset('utf8'); 

$result = mysql_iquery('SELECT * FROM `table`'); 
while ($row = mysql_fetch_assoc($result)) { 
    $message = $row['name']; 
    $message = mb_convert_encoding($message, 'ISO-8859-15', 'UTF-8'); 
    //$message = iconv("UTF-8", "ISO-8859-1//IGNORE", $message); 
    mysql_iquery('UPDATE `table` SET `name`="'.mysql_real_escape_string($message).'" WHERE `a1`="'.$row['a1'].'"'); 
} 

それが「UPDATE」の予想文字で、文字列は文字「A」の後に切り捨てられますことを除いて。つまり、その文字とそれに続く文字は文字列に含まれません。また

、私もの間、いくつかの文字セットをテストしても、//無視し、// TRANSLIT

で、同じことを行います「のiconv()」(それはコードにコメントしている)でテストISO-8859- 1およびISO-8859-15を参照のこと。

私は本当にここで助けが必要です!ありがとうございました。

答えて

102

あなたの説明から、最初はLatin-1として保存されたUTF-8に正しく変換されなかったUTF-8データがあるようです。データは回復可能です。あなたはそれはあなたがデータをエンコード変換中に変更された方法に応じて、内部変換を省略する必要があるかもしれないことは可能です

convert(cast(convert(name using latin1) as binary) using utf8) 

のようにMySQLの機能が必要になります。

+6

を使用!私は決してUPDATEで使用されたこれらの関数を使用したことはありませんでした。どうもありがとうございました! – Nuno

+1

ありがとう!私は各テーブルのすべての列をループする小さなPHPスクリプトを構築しました。トリックをしました:) – wiesson

+0

ありがとうございました!!!!!関連する多くの質問がありますが、これにはUTF-8に正しく変換する関数が含まれています – alds

21

私はこの答えに約1時間か2時間を探しました。古いtt_news dbをタイプミスから新しいタイプ3バージョンに移行する必要がありました。私はすでにエクスポートファイルのcharsetを変換して戻してみましたが、動作しませんでした。

は、私はテーブルの上に更新ABSとstartetから上記の回答を試してみました:

UPDATE tt_news SET 
    title=convert(cast(convert(title using latin1) as binary) using utf8), 
    short=convert(cast(convert(short using latin1) as binary) using utf8), 
    bodytext=convert(cast(convert(bodytext using latin1) as binary) using utf8) 
WHERE 1 

必要な場合にもimagecaption、imagealttext、imagetitletextとキーワードを変換することができます。 これは、誰かがtt_newsを新しいtypo3バージョンに移行するのに役立ちます。

+1

私はあなたに到着するまで私はABSの答えを得ていませんでした。 –

+0

実際、ABSの答えは答えの「鍵」です。マルセルの答えは、完全な例でその「キー」を使用しています。両方をUpvote! –

0

方法は、(これを忘れてはいけない)あなたは、ヘッダータラのhtml内のメタにより、ページのエンコーディングをUTF-8にする必要があります あなたが必要なものにするために、このコードを使用し

データベース通常のより良い方法 使用接続トウであります

その後、WOWあなたが私の一日を保存し、このコードに

$result = mysql_query('SELECT * FROM shops'); 
    while ($row = mysql_fetch_assoc($ 
    $name= iconv("windows-1256", "UTF-8", $row['name']); 

    mysql_query("SET NAMES 'utf8'"); 
    mysql_query("update `shops` SET `name`='".$name."' where ID='$row[ID]' "); 
    } 
関連する問題