varchar(n) の n は「バイト数」ではなく、マルチバイトに対応した「文字数」だからです。
下記のページに詳しく確認した例があります。
http://d.hatena.ne.jp/sotarok/20070821/1187707045
バイト数ではなく、文字数だからです。
データタイプが必要とする記憶容量
http://dev.mysql.com/doc/refman/5.1/ja/storage-requirements.html
ここをご覧頂くと、
例えば、VARCHAR(10) カラムは最大長さ10の文字列を保持する事ができます。カラムが latin1 文字セットを利用すると仮定すると(一文字につき1バイト)、実際の記憶容量は文字列の長さ(L)と、その文字列の長さを記録する1バイトです。'abcd' 文字列では、L は4で、必要とする記憶容量は5バイトです。もし同じカラムが代わりに VARCHAR(500) として宣言されていたら、その文字列 'abcd' は 4 + 2 = 6 バイトを必要とします。カラム長は255以上なので、プリフィックスには1バイトではなく2バイトが要求されます。
特定の CHAR、VARCHAR、または TEXT カラム値を格納するのに利用される バイト 数を計算するには、そのカラムに利用される文字セットを考慮に入れなければいけません。特に、utf8 ユニコード文字セットを利用する時には、全ての utf8 文字セットが同じバイト数を利用するわけではないという事を覚えておく必要があります
とあります。ですから、varchar(100)は100+1バイト、とは限りません。
以下の記事にもありますが、
VARCHAR(N)のNはフィールドのバイトサイズではなく、
最大格納文字数ですので、
VARCHAR(100)のフィールドには全角100文字が格納可能です。
MySQLの基礎を学ぼう [準備編](2/3) - @IT
http://www.atmarkit.co.jp/flinux/rensai/mysql5_04/mysql5_04b.htm...
(本文中に簡単に触れられてます)
MySQL 4.1でunicode等の実装があり、それまでvarchar(n)のnはバイト数であったものが、1バイト文字・2バイト文字に関係なく、文字数に仕様変更されました。
MySQLユーザ会のHPのFAQでも、「4.1以上の壁 (日本語の扱いの違い、文字化け等/含む5.0以上)」の箇所で記載されています。
length関数ではバイト数、char_length関数では文字数が返されます。
MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.3.2 文字列関数
length関数とchar_length関数の結果は、次のようなSQLを実行してもらえれば、一目瞭然です。
select length('aあ'),char_length('aあ');
また、varchar(3)の列を作り、'abc','aあい','あいう'といったデータを格納し、char_length関数とlength関数の結果を見てみてください。
ご回答ありがとうございました。
そういうことだったんですね。
以降、ご回答いただいた方もありがとうございます。