utf8
という名前の文字セットは、文字あたり最大 3 バイトを使用し、BMP 文字だけを含みます。utf8mb4
文字セットは、文字ごとに最大 4 バイトを使用し、補助文字をサポートします。
BMP 文字の場合、
utf8
とutf8mb4
のストレージ特性は同一で、コード値、エンコーディング、長さが同じです。補助文字については、
utf8
はこの文字をまったく格納できませんが、utf8mb4
は文字の格納に 4 バイトを必要とします。utf8
はこの文字をまったく格納しないので、utf8
カラムには補助文字がなく、utf8
データを古いバージョンの MySQL からアップグレードするときに、文字の変換やデータの損失について心配する必要はありません。
utf8mb4
は utf8
のスーパーセットであるので、次の連結のような演算の場合、その結果には utf8mb4
の文字セットと utf8mb4_col
の照合順序が含まれます。
SELECT CONCAT(utf8_col, utf8mb4_col);
同様に、次の WHERE
句内の比較は、utf8mb4_col
の照合順序に従って行われます。
SELECT * FROM utf8_tbl, utf8mb4_tbl
WHERE utf8_tbl.utf8_col = utf8mb4_tbl.utf8mb4_col;
ヒント: スペースを UTF-8 で保存する場合は、CHAR
ではなく VARCHAR
を使用してください。そのようにしないと、MySQL では CHAR CHARACTER SET utf8
(または utf8mb4
) カラムに対して 3 (または 4) バイトを確保する必要があります。これは、可能性のある最大長が 3 (または 4) バイトであるためです。たとえば、MySQL は CHAR(10) CHARACTER SET utf8mb4
カラムに対して 40 バイトを確保する必要があります。