web-dev-qa-db-ja.com

MySQL-UTF8テーブルのlatin1文字をUTF8に変換します

今日だけ、PHPスクリプトでこれが欠落していることに気付きました。

_mysql_set_charset('utf8');
_

私のテーブルはすべてInnoDB、照合「utf8_unicode_ci」であり、すべてのVARCHAR列も「utf8_unicode_ci」です。 PHPスクリプトにmb_internal_encoding('UTF-8');があり、すべてのPHPファイルはUTF-8としてエンコードされています。

したがって、これまで、発音区別記号付きの何かを「挿入」するたびに、例:

_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'].'"');
}
_

文字列「ă」の後に文字列が切り捨てられることを除いて、期待される文字で「更新」されます。つまり、文字と後続の文字は文字列に含まれません。

また、// IGNOREおよび// TRANSLITを使用しても、「iconv()」(コードにコメントされている)を使用したテストは同じことを行います。

また、ISO-8859-1とISO-8859-15の間のいくつかの文字セットをテストしました。

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

43
Nuno

説明から、元々Latin-1として保存されたUTF-8データがあり、UTF-8に正しく変換されていないようです。データは回復可能です。次のようなMySQL関数が必要です。

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

エンコード変換中にデータが変更された方法によっては、内部変換を省略する必要がある場合があります。

115
ABS

この答えを1〜2時間検索した後。古いtt_news dbをtypoから新しいtypo3バージョンに移行する必要がありました。エクスポートファイルの文字セットを既に変換してインポートしようとしましたが、動作しませんでした。

次に、ABSから上記の答えを試し、テーブルの更新を開始しました:

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バージョンに移行するのに役立つことを願っています。

25
Marcel Grolms

方法は、データベースの通常の接続を使用するより良い方法です

次に、このコードを使用して必要なものを作成します。ヘッダーcod htmlのメタによってutf-8をエンコードするページを作成する必要があります(これを忘れないでください)

次に、このコードを使用します

    $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]'  ");
    }
0
hussien