MySQLのカラム型と長さの選択方法

このQ&Aのポイント
  • MySQLのカラム型と長さの選択方法について教えてください。
  • MySQLのカラム型は、文字列の長さやデータの種類に応じて適切なものを選ぶ必要があります。
  • 住所などの比較的短い文字列にはVARCHAR型を、メッセージなどの長い文字列にはTEXT型を使用することが一般的です。また、小数点数にはDECIMAL型を使用します。
回答を見る
  • ベストアンサー

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

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

  • MySQL
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

MySQL 4.0.27とのことですが、MySQL 4.1以降に上げることはできないでしょうか? MySQL 4.1やMySQL 5.0で、多くの機能追加や一部の仕様変更があります。 >例えば、VARCHAR(100)というカラム型を設定すると、全角文字が33文字と半角文字が1文字入る VARCHAR(n)は、MySQL 4.0まではnバイトまで格納できました。MySQL 4.1以降では、1バイト文字・2バイト文字に関係なく、n文字まで格納できるように仕様変更されています。 >TINYTEXT(100)とすると、上記よりもっと長く格納できるようです TINYTEXTには、(100)といった指定はできないはずです。TEXT(100)の誤りでしょうか?(n)を指定した場合、「指定された値を格納できる十分な領域を確保する」となっており、4KBや8KBくらいは最低でも確保されるのかも知れません。 >他にもBLOBやBINARYなどたくさんあり BLOBは、画像データ等を格納することを想定したデータ型です。 >住所などのように、比較的短いことが予想される文字列 文字数が固定ならchar(n)、文字数が可変で255文字までならvarchar(n)といった感じです。 インデクスを付けたり、order byやgroup byを指定する場合、MySQL 4.0くらいだと、長さ制限があったように思います。 その後のバージョンでこれら制限のいくつかは緩和されましたが、やはりオーバヘッドがあると思います。 >メッセージなどのように、数十文字から数千文字までが予想される文字列 上述のように、検索の条件にしたり、order byやgroup byで指定される可能性のある列は、なるべくvarcharにした方が良いでしょう。 そういった操作をすることがなく、最大長の予測が困難な場合は、textを選択するしかありません。 >整数部3桁、小数部20桁程度の小数点数 小数点以下が20桁というのは、あまり一般的なデータとは言えないと思いますが?どういったデータなのでしょうか? 小数部も高精度で維持する必要があるなら、decimalを使うしか選択肢はありません。dec(23,20)といった指定になります。 詳しくは、マニュアルの以下の記述を、参照してみてください。 http://dev.mysql.com/doc/refman/4.1/ja/column-types.html http://dev.mysql.com/doc/refman/4.1/ja/silent-column-changes.html

ka-kichi
質問者

お礼

丁寧なご回答ありがとうございます。 DBのバージョンですが、レンタルサーバーなので、バージョンを換えるには契約しなおすしかないかもしれません。(未調査) さらにこの契約で、別のシステムも稼働中ですので、あまり動かしたくないのが本音です。 ですので、しばらくは4.0で利用することになります。 TINYTEXT(100)は当方の間違いでした。(^^ゞ 今回は、VARCHAR(n)とTEXTを使おうと思います。(TEXTは、コメント部なので、ORDER BYなどは不要です。) 小数点数は、地図データの緯度経度を格納する予定です。 小数第15位くらいまでは必要のようです。 こちらはDECIMALを使おうと思います。整数部は3桁以上にはなりませんので、(23,20)でいけると思います。 ご提示いただいたマニュアルも読んだのですが、日本語が難しく苦労してます。(^^ゞ

関連するQ&A

  • 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
  • カラム名でseqとidではどちらがふさわしいのでしょうか?

    mysql5.1.33を使用しています。 例えば、ユーザ情報を格納するuserテーブルがあって ユーザが決める半角英数字からなるIDを格納するuser_idカラムがあるとします。 そしてAuto Incrementなカラムも付け足すと、 [user] seq INT(11) NOT NULL AUTO_INCREMENT, user_id varchar(16) PRIMARY KEY (seq) UNIQUE KEY user_id (user_id) この場合はseqカラムが主キーになるわけですが、 一般的にはカラム名はseqではなくてidですよね? なんで自分はseqにしたかというと、 user_idカラムのidには文字(半角英字)のIDを、 seqは連番を意味づけさせたいと思いました。 つまり seqがつくカラム名は連番で idがつくカラム名は文字列 と直感的に分かりやすくなるだろうと思ったからなのですが、 みなさんはこのケース(そもそもこのカラム構成が正しいかは分かりませんが・・)の場合は、 どのようなカラム名を付けますか?

  • mysqlの型について質問です。

    mysqlの型について質問です。 mysqlでvarchar(1) nullという使い方はどのような時に使用するのでしょうか? 可変長文字列で1文字でnullが有効と言うことは char(1) nullで良かったりするのでしょうか?

    • ベストアンサー
    • MySQL
  • 大文字、小文字のバイナリ型について

    Mysqlで大文字と小文字を区別するように、特定のカラムにBINARYを設定しましたが、逆に、それを解除(削除)する方法はありますでしょうか? BINARYの設定の方法は多くのサイトで見つけられましたが、削除の方法は分かりませんでした。 どなたかよろしくお願いします。

    • ベストアンサー
    • MySQL
  • mysqlで長さ無制限の文字列を格納することはできますか?

    mysqlを用いて掲示板を作りたいです。その際に、簡素化のため、掲示板の全てのデータをmysqlに格納したいと思っています。 また、掲示板における本文の部分は、文字列の長さを無制限にするのが妥当だと思います。 しかし、mysqlのマニュアル(http://dev.mysql.com/doc/mysql/ja/BLOB.html)によると、一番大きい型であるLONGBLOB型の記憶容量は 2^32バイトとなっており、それを超える文字列は切り捨てられるとなっています。 そこで、ご教授いただきたいです。 長さ無制限の文字列をmysqlに格納する方法はありますか?そしてその場合はどうすればよいですか? それとも、長さ無制限の文字列をmysqlに格納する方法ははなく、その場合は別ファイルを用意し、そちらに書き込むなどをする必要がありますか? どうぞよろしくお願いします。

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

    今までPostgreSQLを利用していたのですが、MySQLもテストで一回使ってみよと思い触ってみたところ・・・ varchar(20)のカラムに、文字列型で「4571170731101」という値を登録するとDB上では「2147483647」となってしまいます。 int型?とかに解釈されてるんでしょうか。意味がわかりません。 どなたか助けてください。

    • ベストアンサー
    • MySQL
  • ユーザ情報を格納するテーブルについて

    MySQLバージョン4.1.16を使用しています。 基本となるユーザ情報を格納するテーブルで、 自動インクリメントされるidというカラムを使用する場合と、 使用しない場合とでは、どちらが良いというのはあるのでしょうか? みなさんはどちらの形で利用しているのでしょうか? [userinfoテーブル] id使用 id UNSIGNED AUTO_INCREMENT PRIMARY KEY user_id VARCHAR(12) UNIQUE password TINYTEXT [userinfoテーブル] id使用しない user_id VARCHAR(12) PRIMARY KEY password TINYTEXT

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

    プログラム初心者です mysqlのカラム、varchar(255)に実験で270文字HTMLフォームからmysqlに入れてみました そうしたら、255文字しか保存されていませんでした もしかしたら、PHPで文字数制限しなくてもmysql側のカラムの文字数設定だけでいいのではないかと思ってしまいましたがこれだと不具合とかでてきますか? データ型のtextも文字数指定できるのでしょうか? やっぱり、文字数制限はPHPなどでやったほうがいいのでしょうか? よろしくお願いします

    • ベストアンサー
    • MySQL
  • 初歩的ですが、どうしてかテーブルが作成できないで困っています。

    こんにちは。 MySQLを使い始めたのですが、 テーブルを作成するという初歩的な部分で、 どうしても自分では分からなくなってしまい 質問させていただきます。 create databaseを行った後、 普通にテーブルを作成しようとしただけではあります。 作成しようとしたテーブルは、 keyというカラムとvalueというカラムの 計2つからなるテーブルです。 しかし、 カラム名の1つを「key」ではなく「time_to_get_the_key」で行うと、 正常にテーブルが作成されるのに、 mysql> CREATE TABLE 20090413_put1(time_to_get_the_key VARCHAR(100), value VARCHAR(100)); Query OK, 0 rows affected (0.01 sec) 同じカラム名を「key」でテーブル作成しようとすると、作成ができないでいます。 mysql> CREATE TABLE 20090413_put1(key VARCHAR(100), value VARCHAR(100)); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VARCHAR(100), value VARCHAR(100))' at line 1 本来は、 「key」と「value」というカラムで、 それぞれ100文字以内で収まる文字列を カラムに挿入させるつもりでした。 何か御意見いただけるとありがたいです。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • カラムの削除が出来ません

    Microsoft SQL2000を使用しているのですが あるテーブル(table_A)のカラム(column_A)を削除したいので 以下のようなクエリ及び、GUIでの削除を実行しました。 ----------------実行クエリ----------------------- ALTER TABLE dbo.table_A DROP COLUMN column_A GO ------------------------------------------------- ところがどちらの削除を方法を実行しても以下のようなエラーメッセージが返されます。 -----------------エラーメッセージ---------------- テーブル 'table_A' - テーブルを修正できません。 ODBC エラー : [Microsoft][ODBC SQL Server Driver][SQL Server] 行 2: 'column_A' の近くに無効な構文があります。 ------------------------------------------------- カラム名の変更などはできるのですが どうしても削除だけ出来ません。 なお、このカラムは主キーとしての設定や 他のテーブルへの外部キーとしての設定を行っていません。 型は[varchar] (20) COLLATE Japanese_BIN NULLです。 どなたか対処方法をご存知の方がおられましたら ご回答よろしくお願いします。 それでは失礼します