SQLYog Enterprise
からこの定義を取得したMySQL table
があります。
Table Create Table
----------------- ---------------------------------------------------------
etape_prospection CREATE TABLE `etape_prospection` (
`etape_prosp_id` int(10) NOT NULL AUTO_INCREMENT,
`type_prosp_id` int(10) NOT NULL DEFAULT '0',
`prosp_id` int(10) NOT NULL DEFAULT '0',
`etape_prosp_date` datetime DEFAULT NULL,
`etape_prosp_comment` text,
PRIMARY KEY (`etape_prosp_id`),
KEY `concerne_fk` (`prosp_id`),
KEY `de_type_fk` (`type_prosp_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
このテーブルのdefault charset
をlatin1
からutf8
に変更します。どうやってするか ?
テーブルdefault character set
およびすべての文字列を新しい文字セットに変更する場合は、次のようなステートメントを使用します。
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
したがって、クエリは次のようになります。
ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;
テーブルのデフォルトの文字セットを変更します。
ALTER TABLE etape_prospection
CHARACTER SET utf8,
COLLATE utf8_general_ci;
文字列列の文字セットを変更するには、次のクエリを実行します。
ALTER TABLE etape_prospection
CHANGE COLUMN etape_prosp_comment etape_prosp_comment TEXT CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE
MySQLコマンドでトリックを行う必要があります。次のコマンドは、テーブルのデフォルトの文字セットとすべての列の文字セットをUTF8に変更します。
ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
このコマンドは、テーブル内のすべてのテキストのような列を新しい文字セットに変換します。文字セットは文字ごとに異なる量のデータを使用するため、MySQLは一部の列のタイプを変換して、古い列タイプと同じ文字数に適合する十分なスペースを確保します。
ライブデータを変更する前に、 ALTER TABLE MySQLドキュメント を読むことをお勧めします。
alter table set default charset
を使用してデフォルトを変更できますが、既存の列の文字セットは変更されません。これを変更するには、alter table modify column
を使用する必要があります。
列の文字セットを変更することは、より広い範囲の文字を格納できることを意味するだけです。アプリケーションはmysqlクライアントを使用してdbと通信するため、クライアントのエンコードも変更する必要がある場合があります。
すべてのデータベーステーブルのデフォルトの文字セットを変更し、データを変換するための完全なソリューションを誰かが探している場合、これは次のようになります。
DELIMITER $$
CREATE PROCEDURE change_character_set(in charset VARCHAR(64), in collation VARCHAR(64))
BEGIN
DECLARE done BOOLEAN DEFAULT false;
DECLARE tab_name VARCHAR(64);
DECLARE charset_cursor CURSOR FOR
SELECT table_name FROM information_schema.tables
WHERE table_schema = DATABASE();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET foreign_key_checks = 0;
OPEN charset_cursor;
change_loop: LOOP
FETCH charset_cursor INTO tab_name;
IF done THEN
LEAVE change_loop;
END IF;
SET @alter = concat('ALTER TABLE ', tab_name,
' CONVERT TO CHARACTER SET ', charset,
' COLLATE ', collation , ';');
SELECT @alter;
PREPARE stmt FROM @alter;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP change_loop;
CLOSE charset_cursor;
SET foreign_key_checks = 1;
END$$
DELIMITER ;
このコードをファイル内に配置できます。 chg_char_set.sql
および実行します。 MySQLターミナルから呼び出すことにより:
mysql> source ~/path-to-the-file/chg_char_set.sql
次に、必要な入力パラメータを使用して定義済みのプロシージャを呼び出します。
mysql> change_character_set('utf8mb4', 'utf8mb4_general_ci');