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) に変換されていた事から気付きました。

メモ帳の置き換えで手間取った話

ずっと前に windows7 のメモ帳を置き換えて、別アプリで起動するように設定していました。ところが、一部のアプリでレポート表示を行うとエラーになる事があり、直らないかと色々試した経過を、忘れないように書いておきます。

まず結論から言うと、レジストリの HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe 中で Debugger に文字列(REG_SZ)としてアプリへのフルパス(とオプション)が書いてある場合、拡張子の関連付けよりも優先されていました。このため、いくら関連付けや notepad.exe の置き換えを試しても効果がありませんでした。おそらく環境設定系のアプリを利用した際に追加されたのだと思うのですが、普段使っているツールフォルダの中には入っていなかったようで、具体的にどうやって設定されたのかは不明です。

更に面倒を増やしていたのが、拡張子によって動作を変更するソフトを経由していた事でした。当時の自分としては設定の柔軟性を期待していたのだと思います。しかし、これがまた問題で、関連付けに従ってファイルを表示する場合は大丈夫なのですが、自力でメモ帳を指定されてしまうと exe ファイルへの拡張子別設定が利用されてしまい、肝心のテキストファイルが開かれない状態になっていました。

以上のように複数レイヤで設定されていたため、結論に辿り着くまでに散々 Try & Error を繰り返すことになりました… つくづく作業記録の重要性を感じた2時間でした。

最後に備忘録として、メモ帳置き換えを行うために試したアプリを挙げておきます。

  • Terapper : notepad.exe 置き換え型。手作業版。(本来はTerapad用)
  • NotepadBranch : notepad.exe 置き換え型。インストール版。
  • Anterix : 拡張子関連付け変更型。関連する拡張子をまとめて設定可能。
  • Contexter : 拡張子関連付け変更型。「新規作成」や「送る」の変更も可能。