web-dev-qa-db-ja.com

latin1_swedish_ciデータをutf8_general_ciに変換する方法

私はすべてのテーブルフィールドの照合を含むMySQLデータベースを持っています

latin1_swedish_ci

すでに1000件近くのレコードが保存されているので、これらすべてのデータを

utf8_general_ci

そのため、あらゆる言語コンテンツを表示できます。私はすでにフィールド照合をtf8_general_ciに変更しましたが、これは[〜#〜] convert [〜#〜]すべての古いレコードをtf8_general_ciに変更しません=

17
aslamdoctor

一つ面白いこと。

テーブルの文字セットが適切なエンコーディングである場合、Anshuによって提案されたCONVERT TO CHARSETおよびCONVERT()/ CAST()は正常に動作します。

何らかの理由でlatin1列にutf8テキストが含まれている場合、CONVERT()およびCAST()は役立ちません。私はデータベースをその設定で「混乱」させていたので、これを解決するためにもう少し時間をかけます。

文字セット変換に加えてこれを修正するには、いくつかの演習が必要です。

  1. 「ハードワン」は、コンソールから変換されるダンプからデータベースを再作成することです
  2. 「シンプルな」とは、行ごとまたは表ごとに変換することです。
_INSERT INTO UTF8_TABLE (UTF8_FIELD)
SELECT convert(cast(convert(LATIN1_FIELD using latin1) as binary) using utf8)
  FROM LATIN1_TABLE;_

基本的に、どちらの場合も、文字列を元のシンボルに処理し、次に正しいエンコーディングに処理します。これは、simple convert(field using encoding) from table;コマンドでは発生しません。

8
E_ONE

テーブルをエクスポートします。テーブルを削除します。エクスポートファイルをエディターで開きます。テーブル構造が作成された場所で手動で編集します。

古いクエリ:

CREATE TABLE `message` (
  `message_id` int(11) NOT NULL,
  `message_thread_id` int(11) NOT NULL,
  `message_from` int(11) NOT NULL,
  `message_to` int(11) NOT NULL,
  `message_text` longtext NOT NULL,
  `message_time` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

新しいクエリ:(message_textフィールドを変更するとします。)

CREATE TABLE `message` (
  `message_id` int(11) NOT NULL,
  `message_thread_id` int(11) NOT NULL,
  `message_from` int(11) NOT NULL,
  `message_to` int(11) NOT NULL,
  `message_text` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `message_time` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ファイルを保存して、データベースにインポートします。

1
Akhlaque Karim