ソフトウェア

データベースの文字数制限が191文字になっている理由とは?


世の中のデータベースを見ていると、格納するデータの文字数に「191文字以内」という制限が課されている場合があります。一体なぜ191文字という中途半端な数字で制限が行われるのかについて、オープンソースのデータ同期ツールを展開するGrouparooのCTOを務めるエヴァン・ターラーさんが解説しています。

Grouparoo Blog: Why do database columns have a character length of 191?
https://www.grouparoo.com/blog/varchar-191


ターラーさんはまず、現代のデータベースシステムでは無制限に文字を格納する設定も可能だとした上で、文字数の制限で検索速度が向上すると説明しています。例えば、メールアドレスの行が「[email protected]」となっているユーザーを見つけたい場合、なんの工夫も無い状態だとデータを一件ずつ一致するかどうかを確認しなくてはならず、データ量が増えるとともに実行時間も長くなってしまいます。

そこで、データベースシステムに「検索インデックス」の作成を指示すると、データの書き込み時に事前計算が行われるようになり、書き込み時間やディスクの使用量は増えるものの、高速に検索を行うことが可能です。ほとんどのアプリケーションでは書き込みの回数よりも読み取りの回数の方が多くなるため、このトレードオフは価値が高いとのこと。そしてこの検索インデックスを作成する際に「何文字以内のデータが入力されるのか」を事前に指定することでよりパフォーマンスが向上します。


理論上はこの文字数指定に制限はなく、世界で最もよく利用されているデータベースシステムのMySQLはかつて255文字の制限を課していました。ターラーさんによると、255文字になった経緯は諸説あるものの「8ビットで表せる最大の数で効率が良い」「MySQL以前のデータベースシステムとの互換性確保」「インデックスファイルを古いファイルシステムの単一のページブロックに収めたかった」ことなどが有力とされているそうです。いずれにせよ、MySQLでは255文字の制限を前提にパフォーマンスがチューニングされ、後発のデータベースシステムもMySQLに倣って制限を255文字にしていったとのこと。

その後、絵文字の普及に伴って、新たな文字コードに対応する必要が発生します。MySQLは当初、1文字を3バイトで表す文字コードを前提に設計されたため、インデックスは255文字×3バイトが収まる767バイトしか確保されていません。一方、絵文字を利用するには1文字を4バイトで表す「utf8mb4」という新たな文字コードを使う必要があり、結果として文字数には767÷4の191文字以内という制限が新たに課されることになったとのこと。

utf8mb4を始め、現代の文字コードでは全ての文字を表すことが可能で、文字数でインデックスを制限するのは過去の行為となっているものの、互換性を確保するために多くのアプリケーションで191文字制限が使われているとターラーさんは述べています。

この記事のタイトルとURLをコピーする

・関連記事
絵文字の偉大な功績の1つは「文字コードを統一したこと」 - GIGAZINE

HDD故障率のメーカー・モデル別統計データ2020年版、故障率が最も高かったのは? - GIGAZINE

PostgreSQLには「中途半端なサイズ」のデータを格納しないほうがいい - GIGAZINE

SQLiteが「大量の小さなクエリ」の処理を得意とする理由とは? - GIGAZINE

16:9や4:3などの映像縦横比率が決まった本当の経緯と理由とは? - GIGAZINE

in ソフトウェア, Posted by log1d_ts

You can read the machine translated English article here.