MySQLのVARCHAR型 charとは末尾の空白の扱いが違う
  • facebookページ
  • twitterページ
  • 2020.01.22

    MySQLのVARCHAR型 charとは末尾の空白の扱いが違う

    MySQLのvarcharについてまとめています。

    以下、サンプルデータベースとしてEmployeesを、MySQLのバージョンは5.7.28を前提としています。

    MySQLのvarcharとcharの違い 末尾の空白に注意

    MySQLの文字列を扱うデータ型には、varcharとcharがあります。何がどう違うんでしょうか?

    varcharはサイズ可変型、charはサイズ固定型です。内部的な処理によって、文字列の末尾に空白をつけた場合に、動きが変わってきます。

    テスト用のテーブルvchatestを作って、動きを確かめてみましょう。

    varchar型のカラムvarchar_string、char型のカラムchar_string、text型のカラムtext_stringの3カラムを持ったテーブルです。

    テーブル構造はこのようになっています。

    作成したテーブルvchatestに、末尾に半角の空白2個がついた文字列「STR  」をinsertします。

    単純にselectしてみると、いずれも変わらないように見えます。

    concat関数を使って、末尾の空白がどうなっているかを確認してみましょう。

    【関連記事】
    MySQLの文字列結合にはCONCAT。GROUP_CONCATとGROUP BYで複数データ集約

    char型の場合は、挿入した文字列の末尾に追加した半角の空白が削除されてしまいました。

    内部的に固定長でデータを保持するchar型では、最大文字長に足りない文を半角空白で埋めて保存し、selectで取り出す際に末尾の空白を全て削除します。

    そのため、insert時に付加した末尾の空白が、select時にはなくなってしまうんですね。

    末尾の空白を強制削除する処理を回避するのは困難なため、末尾に空白が入る可能性があるデータの場合はcharよりもvarcharを使うのが無難と言えるでしょう。

    varchar使用時の注意点

    MySQLのvarcharのサイズ指定は文字数?バイト数?

    テーブルのカラムがvarchar(8)と定義されていた場合、8文字までデータinsertが可能でしょうか?それとも、8バイトなので半角なら8文字、全角なら4文字まで可能なのでしょうか?

    試してみました。

    まず、「あいうえおあいうえお」は、10文字で20バイトなので「データ長が長すぎる」という旨のエラーが出力されます。

    次に、「あいうえおあいう」をinsertしてみましょう。

    8文字で16バイトなので、varcharのサイズ指定が文字数ならinsert成功、バイト数なら上記と同様にエラーになるはずです。

    SQLの実行は成功しました。

    全角8文字のデータが、varchar(8)に格納できました。

    MySQLのvarchar型のサイズ指定は、文字数です。

    MySQL4.1以前の古いMySQLでは、varcharのサイズ指定は文字数ではなく、バイト数でした。

    varcharとtextの違い textはキーに指定することができない

    varcharもtextも同じく文字列を扱うデータ型ですが、以下の違いがあります。

    • text型は、テーブル作成の宣言時にサイズ指定が不要の可変型
    • text型は、キーに指定することができない
    • varchar型もtext型も65535文字まで格納可能
    • 16,777,215文字格納できるMEDIUMTEXT型、4,294,967,295文字格納できるLONGTEXT型もあり

    varcharの文字数宣言をなくしたものが、text型と考えておくと良いでしょう。

    文字コードセットをutf8mb4に変更すると、varcharのインデックスが設定できないケースあり

    utf8のデータベースを、utf8mb4に変更すると、varcharで設定できる文字の最大数が少なくなります。

    MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.11 以前の Unicode サポートから現在の Unicode サポートへのアップグレード

    このため、今まで使えていたDDLがエラーになる可能性があるんですね。

    ただし、MySQL5.7.9以降ではデフォルト設定値の調整が行われ、特に何もしなくてもエラーが回避できるようになっています。

    MySQL(InnoDB) で charset を utf8mb4 にする注意点の現在 – DEV Community 

    MySQL5.7.8以前を使用していて、utf8mb4に変更する必要があり、MySQLのバージョンアップが可能なら検討するのが良いでしょう。

    まとめ

    ポテパンダの一言メモ
    • MySQLのvarcharとcharは末尾の空白の扱いで違いあり
    • MySQLのvarcharのサイズ指定は、文字列長
    • varcharと似た振る舞いをするtext型はキーに指定することはできない
    • 古いMySQLでは、データベースをutf8mb4変換時に、varcharのインデックス設定で不具合の可能性あり

     



    優良フリーランス案件多数掲載中!
    フリーランスエンジニアの案件をお探しなら
    ポテパンフリーランス

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE