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


96

tableこの定義を持つMySQLがありますSQLYog Enterprise

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このテーブルのをからに変更latin1utf8ます。どうやってするか ?


3
MySQLでの「UTF8」の正しい名前は「utf8mb4」です。文字セット「utf8」は壊れており、3バイト文字までしかサポートしていません。詳細については、MySQLのマニュアルを参照するか、「mysqlの」と「UTF8」...グーグルdev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.htmlを
サミュエル・アスルンド

回答:


202

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

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

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

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8;

22
対照的に、ALTER TABLE tbl CHARACTER SET utf8他の人が提案する構文を使用するだけであれば、テーブルのデフォルトのエンコーディングのみを変更します。この回答を使用した場合とは異なり、既存の列は変換されません。
eaj

7
あなたがデータベースにut8でエンコードされていないすべてのテーブルに対して、この変更を適用したい場合は、このクエリを使用し、得られたクエリを実行することができます SELECT concat('alter table ', table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') FROM information_schema.tables WHERE table_schema='<your_database_name>' and table_collation != 'utf8_general_ci' GROUP BY table_name;
Maxooo

3
これはデフォルトの文字セットを変更していません。デフォルトを変更するには、eakが言ったようにしてくださいALTER TABLE tbl CHARACTER SET utf8
会計士م

7
通常はutf8を使用したくないが、代わりにutf8mb4を使用して、utf8が期待するものになるようにしたいと思います。説明すると、MySQLでは、utf8は実際にはutf8のサブセットにすぎません。指定された最大4バイトではなく、最大3バイトのutf8文字のみをエンコードできます。つまり、多くの絵文字はエンコードできず、DBに書き込もうとすると失われます。例えばを参照してください。medium.com/@adamhooper/…詳細については。
dwt

6
マルチバイトの場合は使用可能ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
RNクシュワハ2018

18

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

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;

10
utf8_general_ciは決して使用しないでください。単に機能しません。これは、50年前のASCII stooopeeedityの古き良き時代の先祖返りです。Unicodeの大文字と小文字を区別しない一致は、UCDからの折りたたみマップなしでは実行できません。たとえば、「Σίσυφος」には3つの異なるシグマがあります。または、「TSCHüẞ」の小文字は「tschüβ」ですが、「tschüβ」の大文字は「TSCHÜSS」です。あなたは正しいことができる、またはあなたは速いことができます。したがって、utf8_unicode_ciを使用する必要があります。正確さを気にしない場合は、無限に高速にするのは簡単です。
Yohanes AI 2017

1
MySQL UTF8文字セットが壊れています。utf8mb4を使用する必要があります!
SamuelÅslund2018

5

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

ALTER TABLE etape_prospection CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

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

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


1
はい、それはトリックを行いますが、1つのことは変換方法によって異なります。古い文字セットオプションを列から自動的に削除することはできません。
tech_me 2014

3

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

DELIMITER $$

CREATE PROCEDURE `exec_query`(IN sql_text VARCHAR(255))
BEGIN
  SET @tquery = `sql_text`;
  PREPARE `stmt` FROM @tquery;
  EXECUTE `stmt`;
  DEALLOCATE PREPARE `stmt`;
END$$

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() AND `table_type` = 'BASE TABLE';
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;
CALL `exec_query`(CONCAT(
  'ALTER TABLE `',
  tab_name,
  '` CONVERT TO CHARACTER SET ',
  QUOTE(charset),
  ' COLLATE ',
  QUOTE(collation),
  ';'
));
CALL `exec_query`(CONCAT('REPAIR TABLE `', tab_name, '`;'));
CALL `exec_query`(CONCAT('OPTIMIZE TABLE `', tab_name, '`;'));
END LOOP `change_loop`;
CLOSE `charset_cursor`;
SET foreign_key_checks = 1;
END$$

DELIMITER ;

たとえばchg_char_set.sql、このコードをファイル内に配置して、MySQLターミナルから呼び出すなどして実行できます。

SOURCE ~/path-to-the-file/chg_char_set.sql

次に、必要な入力パラメータを使用して定義済みのプロシージャを呼び出します。

CALL change_character_set('utf8mb4', 'utf8mb4_bin');

結果をテストしたら、それらのストアドプロシージャを削除できます。

DROP PROCEDURE `change_character_set`;
DROP PROCEDURE `exec_query`;

ビューを選択するための欠落条件もあります。それはWHERE table_schema = DATABASE();です。=> WHERE table_schema = DATABASE()AND table_type = 'BASE TABLE'; でもありがとう!! これが必要です!
nguyenhoai890

2

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

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


もしそれがiPod touchの限られたキーボードのためでなければ:-)
Joni

ほかのiPod touch / iPhoneは、必要があります持っているいくつかの欠点を。:-Pあなたがそれを言及するまで、それらが欠けていることに気づかなかった。;-)
Aufwind 2012年

引用文字のボタンを押し続けると、逆引用文字が表示されます。
クロエ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.