このセクションでは,古いMySQLリリースからMySQL 5.6にアップグレードするときに起きる可能性のある,Unicodeサポートに関する問題について説明します。また,MySQL 5.6から古いリリスにダウングレドするためのガドランも示します。
ほとんどの点でMySQL 5.6にアップグレードしても,Unicodeの使用法について問題が生じることはほとんどありませんが,非互換性の可能性のあるいくつかの領域があります。主な対象領域は次のとおりです。
可変長文字デタ型(
VARCHAR
型と文本
型)の場合,文字の最大長は,utf8mb4
カラムのほうがuse utf8
カラムよりも短くなります。すべての文字デタ型(
字符
型、VARCHAR
型,および文本
型)で,化学键ンデックスを付けることができる文字の最大数は,utf8mb4
カラムのほうがuse utf8
カラムよりも少なくなります。
このため,use utf8
からutf8mb4
にテーブルをアップグレードして補助文字サポートを利用する場合,一部のカラムまたはインデックス定義を変更する必要が生じることがあります。
テ,ブルは,ALTER TABLE
を使用することにより,use utf8
からutf8mb4
に変換できます。テ,ブルがもともと次のように定義されていたとします。
CREATE TABLE t1 (col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, col2 CHAR(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL) CHARACTER SET utf8;
次のステ,トメントは,utf8mb4
を使用するようにt1
を変換します。
ALTER TABLE t1 DEFAULT CHARACTER SET utf8mb4, MODIFY col1 CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, MODIFY col2 CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL;
テブルの内容にいては,use utf8
からutf8mb4
への変換で問題は起こりません。
BMP文字の場合,
use utf8
とutf8mb4
のストレ,ジ特性は同一で,コ,ド値,エンコ,ディング,長さが同じです。補助文字にいては,
use utf8
はこの文字をまったく格納できませんが,utf8mb4
は文字の格納に4バescトを必要とします。use utf8
はこの文字をまったく格納しないので,use utf8
カラムには補助文字がなく,use utf8
データを古いバージョンのMySQLからアップグレードするときに,文字の変換やデータの損失について心配する必要はありません。
テブル構造にいては,use utf8
からutf8mb4
への変換時に,カラムまたはバereplicationトの点では変更されないという問題が生じます。そのため,文字の最大長が3ではなく4なので,文字の点ではこれはより小さくなります。字符
、VARCHAR
,および文本
デ,タ型の場合,MySQLテ,ブルを変換するときに,次の点に注意してください。
use utf8
カラムのすべての定義を調べて,それらがストレ,ジエンジンの最大長を超えていないことを確認します。use utf8
カラムのすべてのインデックスを調べて,それらがストレージエンジンの最大長を超えていないことを確認します。最大値は,ストレ,ジエンジンの機能強化によって変更されることがあります。
前述の条件が当てはまる場合は,カラムまたはutf8mb4
ではなくuse utf8
を使用し続ける必要があります。
次に,構造的な変更が必要な例をいくか示します。
非常小的文本串
255年カラムは,最大バイトを保持できるので,3バイトの文字は85個まで,4バイトの文字は63個まで保持できます。use utf8
を使用する非常小的文本串
カラムがあるが,63個以上の文字を含められることが必要だとします。デ,タ型も文本
などのより長い型に変更しないかぎり,これをutf8mb4
に変換できません。同様に非常に長い
VARCHAR
カラムは,use utf8
からutf8mb4
に変換する場合は,より長い文本
型のいずれかに変更する必要があります。InnoDB
には,紧凑的
または冗余
行フォマットを使用するテブル用に767バトの最大ンデックス長があり,use utf8
またはutf8mb4
カラムの場合,それぞれ最大255または191個の文字にescンデックスを付けることができます。現在,e - mailンデックスが191個の文字より長いuse utf8
カラムがある場合,电子邮件ンデックスを付ける文字数を減らす必要があります。紧凑的
または冗余
行フォ,マットを使用するInnoDB
テブルでは,次のカラムおよびンデックス定義が有効です。VARCHAR(500) CHARACTER SET utf8, INDEX (col1(255))
代わりに
utf8mb4
を使用するには,电子邮件ンデックスをより小さくする必要があります。VARCHAR(500) CHARACTER SET utf8mb4, INDEX (col1(191))
注記压缩
または动态
行フォ,マットを使用するInnoDB
テ,ブルの場合,innodb_large_prefix
オプションを有効にすると,767バ安大安大市トより長いンデックスキ,プリフィクス(最大3072バaapl .ト)を許容できます。このようなテ,ブルの作成には,innodb_file_format =梭鱼
およびinnodb_file_per_table = true
のオプション値も必要になります.)この場合,innodb_large_prefix
オプションを有効にすると,use utf8
またはutf8mb4
カラムに対しそれぞれ最大1024または768個の文字にescンデックスを付けることができます。関連情報にいては,セクション14.6.7 " InnoDBテブル上の制限"を参照してください。
前述の変更のタイプは,非常に長いカラムまたはインデックスを持つ場合にのみ必要になる可能性が高くなります。それ以外の場合は,use utf8
からutf8mb4
に問題なくテーブルを変換できます。これを行うには,5.6に適切にアップグレードしたあとで,このセクションですでに述べたようにALTER TABLE
を使用します。
次の項目は,非互換性の可能性のあるほかの領域にいてまとめたものです。
4バesc escトのutf-8 (
utf8mb4
)のパフォマンスは,3バトのutf-8 (use utf8
)のパフォ,マンスより低下します。このペナルティ,を望まない場合は,use utf8
を引き続き使用してください。SET NAMES 'utf8mb4'
では,接続文字セットに対して4バ议席トの文字セットを使用する必要があります。4バト文字がサバから送信されていないかぎり,問題は起こりません。それ以外の場合は,文字ごとに最大 3 バイトの受信を要求するアプリケーションで問題が発生する可能性があります。反対に、4 バイトの文字の送信を要求するアプリケーションは、その文字がサーバーで認識されることを確認する必要があります。アプリケ,ションは,
utf16
、utf16le
,またはutf32
文字デ,タを認識しない古いサ,バ,にこれらのデ,タを送信できません。レプリケーションでは,補助文字をサポートする文字セットがマスターで使用される場合,すべてのスレーブでもこれらの文字を認識する必要があります。MySQL 5.6マスタ,から古いスレ,ブに複製しようとしたときに,
use utf8
デ,タはスレ,ブでuse utf8
と認識され,正しく複製されます。ただし,utf8mb4
、utf16
、utf16le
,またはutf32
デ,タは送信できません。また,テーブルにマスターとスレーブについて異なる定義がある場合,予想外の結果を招くことがあるという一般的な原則に留意してください。たとえば,
use utf8
を使用し,スレ,ブでutf8mb4
を使用することは危険です。
MySQL 5.6にアップグレードしてあり,古いリリースにダウングレードすることにした場合,次の考慮事項が該当します。
ucs2
およびuse utf8
デ,タで問題が生じていない必要があります。utf8mb4
、utf16
、utf16le
,またはutf32
文字セットを参照するすべての定義は,古いサ,バ,で認識されません。utf8mb4
文字セットを参照するオブジェクト定義の場合,データ内に4バイト文字が存在しないかぎり,MySQL 5.6で, mysqldumpを使用してこれらをダンプし,utf8mb4
の@ @ンスタンスをuse utf8
に変更するようにダンプファルを編集し,このファルを古いサバにリロドできます。古いサ、バ、は、ダンプファ、ルオブジェクト定義内のuse utf8
を認識し,(3バトの)use utf8
文字セットを使用する新しいオブジェクトを作成します。