MySQL の varchar 最大文字数について

掲題の件でちょっと引っかかってしまったので、忘れないようにメモしておきます。

MySQL のリファレンスを見ると、「10.5 データタイプが必要とする記憶容量」ページに 『varchar 型カラムの有効最大長は 65532 まで』と書いてあったので、素直に「varchar(65532)」で使おうとしたら怒られました。
というか、勝手に mediumtext に変更されてしまいました。

仕方無いので色々試していたところ、なぜか「varchar(20000)」だと通ったので、その後に alter table でカラム長を varchar(25000) に増やそうとしたところで 「最大 21845 までしか使えへんで(意訳)」というお叱りを受け、そういえば UTF-8 が最大3バイト食うんだっけと思い出して 3 × 21845 を計算してみたら、ぴったり 65535 だったというお話でした。

つまり varchar のサイズ指定は、最大でも「65535 ÷ 文字のバイト数」までしか使えないという教訓を得たのでした。
あと、text系のカラムでも「長さ=文字数×文字のバイト数」で計算されるようです。上の例で text よりも長い型である mediumtext (2^16(=65536) < L < 2^32) に変換されていた事から気付きました。