I thought I'd provide the response that Ellis Lab gave me for this issue, for others who may need it in the future. Unfortunately, it doesn't solve my issue, since rolling back the database at this point really can't be done. The client gets hundreds of new entries into EE2 every couple of days and its been almost a month since the transition. That said here are the details from Ellis Lab…
The html entities are the result of double-encoded data. As part of the upgrade process, ExpressionEngine converts your database to UTF-8. However, if any data is already set to UTF-8, it will be re-encoded and you will see the bizarre characters.
Essentially, you need to roll back to the pre-upgrade state. Once you are there follow these steps.
Edit out this bit in /system/expressionengine/installer/updates/ud_200.php
Find: foreach ($tables as $table) { $progress = "Converting Database Table {$table}: %s"; $count = $this->EE->db->count_all($table); $offset = 0;
It should be around line 415. Now comment out the code beginning with:
/*
if ($count > 0) //around line 421
... all the way through ...
$offset = $offset + $batch; // around line 465
}
*/
Then upload this to your server and perform the upgrade per the instructions.
What this will do is convert your tables to UTF-8 collation but not the data in those tables. This will be safe through future updates too. This simple edit keeps the installer from double-encoding the data.
So now that I know the process or issue is one of double encoding, I'm trying to find a method that will decode content of a query. Considering the size of the clients database (over 45,000 records), the Asian language records make up a very small percentage (around 300 records).
Decoding them one by one has been relatively easy, but is obviously time consuming. A scripted decode solution would be great. I've tried with MySQL alter statements
ALTER TABLE exp_weblog_data MODIFY field_id_1 text character set binary;
ALTER TABLE exp_weblog_data MODIFY field_id_1 text character set utf8;
as well as testing against some conversion statements, such as
SELECT field_id_1
CONVERT(CAST(field_id_1 AS BINARY) USING utf8)
FROM exp_channel_data
WHERE channel_id="6";
I tried the ALTER on the old database table, to see if it would work, since the data seems to be encode in that one as well (though displays fine in the control panel). I didn't want to deal with any unexpected repercussions of ALTERing the live database.
I did find a few great resources on MySQL conversion issues, which may help others in the future:
Nic Jansma wrote up an awesome article on various conversion issues, how to test, and how to convert, see:
http://nicj.net/mysql-converting-an-incorrect-latin1-column-to-utf8/
Mattias Gunneras got me started on the testing of ALTER table commands, which may work for many, though didn't for me, see:
http://www.bothernomore.com/2008/12/16/character-encoding-hell/
The GeekGuide provided some more insight into how to properly use CONVERT, CAST, and BINARY, see: http://www.geeksengine.com/database/single-row-functions/conversion-functions.php
Ultimately, it maybe quicker for me to convert the records by hand, just copying and pasting from the old control panel to the new control panel. But since I expect this maybe an issue again in the future, I'm still working on finding a scripted process for dealing with the issue.
My goal is to figure out how to run a UTF8 Decode (like: http://www.utf8converter.com ) on select records in a database, store in a temporary table, then UPDATE the database with the converted data.
Updated. 12/17/2012. Ellis Lab wrote a quick extension, 'EllisLab High ASCII Decode' that converts for the control panel, making Asian Languages fully readable and editable. Apparently a leftover setting from EE 1 did an 'auto_convert_high_ascii' and that was the issue. So this is now totally resolved.