varcharのMは文字数かバイト数か?

このQ&Aのポイント
  • varchar属性にvarchar(10)と指定すると10文字入ると思っていたのですが、全角で入力すると5文字、半角で10文字でした。
  • マニュアル6.2のカラム型によると、M の範囲は 0 〜 255 文字とあります。
  • LONGだけが「バイト」という表現、それ以外はvarcharも含めて文字数という表現なので、当然文字数でカウントしていると思っていたので完全に計算が狂いました。これはマニュアルが間違えているのでしょうか?それとも、文字コードによって変わるのでしょうか?MySQLでどの文字コードが使用されているかどこを見れば分かるのですか?
回答を見る
  • ベストアンサー

varchar(M)のMは文字数ですかバイト数ですか?

os:ターボlinuxです。 varchar属性にvarchar(10)と指定すると10文字入ると思っていたのですが、全角で入力すると5文字、半角で10文字でした。 マニュアル6.2のカラム型によると、 M の範囲は 0 〜 255 文字とあります。 TINYBLOB , TINYTEXT は最大長が 255(2^8 - 1)文字 BLOB , TEXTは 最大長が 65535(2^16 - 1)文字 MEDIUMBLOB , MEDIUMTEXTは 最大長が 16777215(2^24 - 1)文字 そして LONGBLOB , LONGTEXT は最大長が 4294967295 または 4G(2^32 - 1)バイト となっています。 LONGだけが「バイト」という表現、それ以外はvarcharも含めて文字数という表現なので、当然文字数でカウントしていると思っていたので完全に計算が狂いました。 これはマニュアルが間違えているのでしょうか? それとも、文字コードによって変わるのでしょうか? その場合、どの文字コードがバイト換算でどの文字コードが文字数換算なのでしょうか? また、MySQLでどの文字コードが使用されているかどこを見れば分かるのですか? となたかご教授下さい。

  • MySQL
  • 回答数2
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • taskuni
  • ベストアンサー率71% (49/69)
回答No.2

>百歩譲って間違いではないとしても、著しく不備があるとは言えますね。 翻訳されたものなら仕方ないと思います。でも、確かに少しくらい注釈が有った方が親切かもしれませんね。 >これは使用する文字コードによって変わるのでしょうか? >その場合、どの文字コードがバイト換算でどの文字コードが文字数換算なのでしょうか? 同じ文字コード内でも文字によって必要とされるバイト数が違いますから、マニュアルで文字単位で記されている物をバイトで考えた方がいいと思います。 255文字→255バイト MySQLでの文字コード確認方法はこちら。 http://www.javadrive.jp/mysql/control/index1.html 参考URLは文字コードについてのページです。

参考URL:
http://ash.jp/code/code.htm
webuser
質問者

補足

>翻訳されたものなら仕方ないと思います。でも、確かに少しくらい注釈が有った方が親切かもしれませんね。 念の為にen版を見てみました。 英語は解らないですけどlengthという表現しか用いていないので完全に誤訳ですね。 The length can be any value from 0 to 255. 「長さは0から255の範囲を如何様(いかよう)にも指定可能」 と直訳すれば良かったのですが、 「範囲は 0 ~ 255 文字」 と誤った意訳をしたみたいですね。 翻訳はコンピュータ知識のない人がする場合もありますから、コンピュータ知識のある人が指摘してあげないといけませんね。 「タダのものだから仕方ない」とスルーする気持ちが訂正するチャンスを奪っているのでしょうね。。 それはさておき、 >参考URLは文字コードについてのページです。 ありがとうございました。 ServerとClientの文字セットを確認するとlatin1(西欧)でした。 Server characterset: latin1 Client characterset: latin1 これを Server characterset: sjis Client characterset: sjis にしたり Server characterset: ujis Client characterset: ujis にしたりして create table tb1 (it1 varchar(4)); insert into tb1 values ( 'ああああ' ); select * from tb1; を試しましたが、いずれも結果は +------+ | it1 | +------+ | ああ | +------+ でした。 文字セットとは無関係に常にvarchar(M) の M=バイト数みたいですね。。

その他の回答 (1)

  • taskuni
  • ベストアンサー率71% (49/69)
回答No.1

文字数というのは、半角文字(1バイト文字)を基本に考えて解説がされていると思います。マニュアルに間違いは無いと思います。 日本語を使うのであれば、倍の領域を確保することを考えてデータベースを作らないといけません。

参考URL:
http://www.pc-view.net/Help/manual/0082.html
webuser
質問者

補足

1バイト=1文字という狭義的な解釈に対し何の注釈も振ってないこと自体、マニュアルの不具合ですね。 それに、既に書いたようにLONGだけが「バイト」という表現、それ以外はvarcharも含めて「文字数」という表現であることからさらに解釈を難解にしている。 もはやこれは間違いと言っても過言ではないです。 百歩譲って間違いではないとしても、著しく不備があるとは言えますね。 間違い間違いでないの話は、これで終わりとして、 これは使用する文字コードによって変わるのでしょうか? その場合、どの文字コードがバイト換算でどの文字コードが文字数換算なのでしょうか? また、MySQLでどの文字コードが使用されているかどこを見れば分かるのですか?

関連するQ&A

  • MySQL5.1の文字列サイズは文字数ではない?

    blue-horse と申します。 お世話になります。 MySQL 5.1 でVARCHAR、CHAR などの字列型フィールドのサイズ指定は、文字数であると認識していたのですが、違うのでしょうか。 utf8の日本語を保存しようとすると、3倍のサイズを要してしまいます。 これはutf8の漢字は3バイトであることと符合するので、なんとなく理解できるのですが、MySQL5.1のリファレンス記述と一致しない様に見えて、納得できません。(不便ですし) >CHAR と VARCHAR タイプには、格納したい最大文字数を表す長さが宣言されています。例えば、CHAR(30) は最大30文字まで持つ事ができます。 「MySQL :: MySQL 5.1 リファレンスマニュアル :: 10.4.1 CHAR と VARCHAR タイプ」 より http://dev.mysql.com/doc/refman/5.1/ja/char.html あるいは、どこか設定を誤っているのでしょうか。 ご教示頂ければ有り難く存じます。 以上、失礼いたします。

    • ベストアンサー
    • MySQL
  • MySQLのvarchar型とtext型について

    以下のURLのページを読んだのですがよく理解できません。。。 http://dev.mysql.com/doc/refman/4.1/ja/storage-requirements.html http://dev.mysql.com/doc/refman/4.1/ja/blob.html 例えば'abc'という文字列を格納するとした場合、記憶容量は varchar型では3+1バイト、text型では3+2バイトとなるようですが、 1バイト(varchar)と2バイト(text)の違い以外で、 text型の方がDBに負担がかかるとか不利になるようなことはありますか? text型では格納する文字列の長さに関係無く、65535バイトを常に確保しているとか… text型の方が動作が遅いとか… 現状、255バイト以下を想定しているのでvarchar(255)にするつもりですが、 将来的に256バイト以上となることもありえるので 最初からtext型にしていた方がいいのでしょうか? また、将来text型に変更した際にパフォーマンスが落ちる等といったことがありえるのでしょうか? 宜しくお願い致します。

  • MySQL 5.0.41 のvarcharの文字数について(utf8の場合)

    MySQL 5.0.41を使っております。正確には、Mac OS X上でMAMP ver 1.7を導入しております。この環境で、以下の文を実行すると、 show variables like 'character\_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | +--------------------------+--------+ です。ここで、質問なのですが、 フィールドの型としてvarchar(50)とすると、 全角文字が16文字しか入りません。 つまり、UTF8の全角1文字に対して3バイトとカウントしているためと思われます。つまりvarchar(50)と設定すると、 50/3=16.66.. なので、このvarchar(50)は、50バイトまでと設定していることになります。MySQL4.1以降は()の中身は文字数と聞いていたのに、 実際とは異なり、しっくりきません。この結果は正しいのでしょうか?

  • VARCHAR型のデータをgetString以外でうけとるには?

    最大32000バイトのEBCDIC文字列(VARCHAR FOR BIT)をDBからうけとって、それを1バイトずつ処理していかないといけないのですが、出力パラメータがVARCHARのデータをgetString()でうけとると暗黙的にユニコード変換されてしまい、結果が異なってしまいます。 なにか良い方法はないでしょうか?

  • 適切なカラム型と長さを教えてください

    MySQL4.0.27です。 最近、MySQLの勉強を始めました。 PHPと合わせて、試行錯誤を繰り返していますが、どうしてもカラム型が理解できずにいます。 いろいろ調べましたがよくわかりませんでしたので、教えてください。 例えば、VARCHAR(100)というカラム型を設定すると、全角文字が33文字と半角文字が1文字入るようです。 次に、TINYTEXT(100)とすると、上記よりもっと長く格納できるようです。(文字数は未確認) 他にもBLOBやBINARYなどたくさんあり、どれを使うべきかわかりません。 以下のような場合、どの型をどれくらいの長さで設定するのが一般的なのでしょうか? ・住所などのように、比較的短いことが予想される文字列 ・メッセージなどのように、数十文字から数千文字までが予想される文字列 ・整数部3桁、小数部20桁程度の小数点数 上記3点について、一般的な型と長さを教えてください。

    • ベストアンサー
    • MySQL
  • 文字のバイト数について

    現在VBの勉強をしております(WindowsXP、VB6.0) テキストボックスの文字数(バイト)チェックを行っていて、不思議に思った事があるので質問させてください。 C言語では、数字の「1」は1バイトなのに、VBのLenBで取得すると、2バイトです。 これって何ででしょうか? 文字コードが違うからでしょうか? 以上、よろしくお願いいたします。

  • 【超基礎】全角文字数とバイト数の数え方

    氏名を格納するmynameという項目があるとします。ここには 全角10文字まではOK、全角11文字以上ダメ、 という文字数制約を設けたいと思います。 MySQL側: myname varchar(20) なフィールドをテーブルに作成し、 PHP側: if (strlen($myname) > 20) { echo "全角10文字までにしてください"; } としました。 HTML側で、 「小泉純一郎」と入れたら、全角6文字なのに 「全角10文字までにしてください」と出てしまいます。 全角10文字まではOK、全角11文字以上ダメ、 とするには、 MySQL側:varchar(20) PHP側:> 20 の数字をいくつにすればいいですか。 全角は2バイトだと思ってたのですが。

    • ベストアンサー
    • PHP
  • MySQLでvarchar型のデータの最大値を取得する方法

    お世話になります。 どなたかご回答&アドバイスをよろしくお願い致します。 MySQLで、以下のように登録されているデータがあるとします。 ID(varchar) | name(varchar) 0000001 | ああああ 0000002 | いいいい 0000004 | ううううう それで、登録されているIDの最大値+1を取得したいのです。 IDのカラムのデータ型がIntならmaxで取得できると思うのですが、データ型がvarcharなので…。 レコードの数+1というのは、IDが必ずしも1から飛びがなく登録されているとは限らないので、 その方法は危ないのでできません。 上の例だと、「0000005」を取得したいです。 どうぞご教授お願い致します。

    • ベストアンサー
    • PHP
  • Excelでバイト数の最大数が決まったデータを作りたいんです!

    上手く説明出来ないんですが・・。 エクセルで、項目それぞれにバイト数の最大数が決まったデータを作りたいんです。 例えば ◆職員番号・・・バイト数12(半角)         職員番号は8桁なので、その後ろに残り12バイトまでの半角パディング。 ◆氏名 ・・・ バイト数16(全角8字まで)         全角8文字以内なら、その後ろに残り8文字までの全角パディング。         全角8文字を超す氏名なら、8文字で切る。 ◆カナ ・・・ バイト数58(半角)         半角カナ文字で残りの58バイトまで半角パディング。 *これをcsvに変換します! これを文字列だけ打ち込んだら、自動で最大バイト数まで半角・全角を埋めるようにすることは出来るでしょうか? また、氏名のところのように自動で8文字までの入力しか出来なくするようにすることは出来るでしょうか? 説明が下手で申し訳ないんですが、おわかりになる方ご教授下さい。 よろしくお願いします!!

  • 文字列のバイト数を取得したい

    処理中に渡ってくる文字列のバイト数を取得したいのですが、 そういった関数はありませんでしょうか? 探しても見つかりませんでした。 文字列はUTF-8かSJISで渡ってきますので、両方に 対応していると嬉しいです。 対応していなければ渡ってくる前に文字コードを 変換します。 どなたかご教示下さい。

    • ベストアンサー
    • PHP