web-dev-qa-db-ja.com

MySQLテーブルのデフォルトの文字セットを変更する方法は?

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 charsetlatin1からutf8に変更します。どうやってするか ?

77
pheromix

テーブルdefault character setおよびすべての文字列を新しい文字セットに変更する場合は、次のようなステートメントを使用します。

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

したがって、クエリは次のようになります。

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;
174
user319198

テーブルのデフォルトの文字セットを変更します。

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;
17
Devart

ALTER TABLE MySQLコマンドでトリックを行う必要があります。次のコマンドは、テーブルのデフォルトの文字セットとすべての列の文字セットをUTF8に変更します。

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

このコマンドは、テーブル内のすべてのテキストのような列を新しい文字セットに変換します。文字セットは文字ごとに異なる量のデータを使用するため、MySQLは一部の列のタイプを変換して、古い列タイプと同じ文字数に適合する十分なスペースを確保します。

ライブデータを変更する前に、 ALTER TABLE MySQLドキュメント を読むことをお勧めします。

4
piersadrian

alter table set default charsetを使用してデフォルトを変更できますが、既存の列の文字セットは変更されません。これを変更するには、alter table modify columnを使用する必要があります。

列の文字セットを変更することは、より広い範囲の文字を格納できることを意味するだけです。アプリケーションはmysqlクライアントを使用してdbと通信するため、クライアントのエンコードも変更する必要がある場合があります。

2
Joni

すべてのデータベーステーブルのデフォルトの文字セットを変更し、データを変換するための完全なソリューションを誰かが探している場合、これは次のようになります。

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');
1
milijan