• ベストアンサー

ID番号に対するデータタイプは?

MySQL初心者です。 ぐぐって見たのですが、良く分からなかったので質問します。 フィールドが最大5桁の数字で構成された社員IDナンバーの場合、データ型は int(5)、varchar(5)、char(5)、numeric(5) のどれになるのでしょうか?numericで試したところ、テーブルを作成すると社員IDのデータ型がdecimal(5,0)になったので、おそらくそれは無いと思うのですが。 回答、お願いします。

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

  • ベストアンサー
  • hogya
  • ベストアンサー率67% (49/73)
回答No.1

質問の意図は「社員IDナンバーのデータ型をどう設計したらよいでしょうか?」ということでよかったでしょうか。 もし、設計者が他にいる場合は設計者が指示したデータ型ということになります。 というのもテーブル設計はひとつの正解があるものではなく、前提によって妥当なデータ型が異なるからです。 ということで、続けます。 まず、設計する際に決定すべき大きな要素としては下記があります。 1.データベースのデータ自体に数値以外を入れた場合にエラーとしたいかどうか   つまり、プログラムでのチェックだけで防ぐのではないということです。   この時点でYESならば、文字列型(varchar、char)は対象外になります。 2.社員IDナンバーで昇順の並び替えを行った場合に、順番に並ぶことを期待するかどうか   文字列型で定義した場合に、1, 2 ,10 というデータの場合は1, 10, 2に並んでしまいます。 上記を踏まえた上で各データ型を採用した場合の特性を説明します。 書いておられる通り、numericはdecimalのことですので、int(5)、varchar(5)、char(5)、decimal(5,0) の四つについて説明します。この中でデータの長さ、つまり桁数を意味しているのはvarchar(5)、char(5)、decimal(5,0)の三つです。 int(5)の場合は、「表示の桁数」を指定しているだけであり、実際はint型の最大数(2147483647または4294967295)まで入ります。 なので、int型を選択した場合は、データに5桁の数だけを入れるという制限はできません。 varchar(5)とchar(5)については、5文字に満たない文字を入れても必ず5文字になるのがchar(5)というだけでそれ以外の違いはありません。 つまり、社員IDナンバーが必ず「00001」というような5桁の形でしかデータを入れないのであれば、同じということです。 また、このような形であれば2.の並び替えの問題も発生しません。 decimal(5,0)は桁数の指定なので、6桁以上の数値データは入れることができませせん。ただし、負数は入れることができるので、これも防ぎたい場合は、UNSIGNEDオプションを付ける必要があります。(これはint型も同様です) 以上、これらのことを考慮、決定した上で今回のケースで適切なデータ型を選択することになります。 例えば、データ自体に5桁の数値以外や負数を入れたくなく、並び替えで綺麗に並べたければdecimal(5,0)、ただし、印刷など5桁で必要な場合は加工する。 とか、プログラムで社員IDナンバーは5桁に加工されて入ってくるし、並び替えも問題ないし、印刷時の加工なども不要になるのでchar(5)にする。 という具合ですね。 最後に、長文になりましたが、補足として社員IDナンバー自体がどう採番されるか?というようなことも大事ですね。 つまり、社員IDナンバー用の採番テーブルなどが別にあるような場合は、そのデータ型と同じの方がよいでしょう。 参考 http://dev.mysql.com/doc/refman/5.1/ja/numeric-types.html

jikitarisu1
質問者

お礼

ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

5桁に限定して良いならchar(5)、少しでも省略したいなら int(5) のunsigned zerofillをつかう

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • MySQLのselect文で、最大ID値のデータを呼び出す

    MySQLのテーブルのフィールド名として「ID」を登録しています。(型はint) そこで、select文で最大ID値のデータを呼び出すにはどうすればいいのか教えて頂けないでしょうか? select * from tableA ?????;

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

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

    • ベストアンサー
    • PHP
  • varcharでの最大値抽出

    すいません。お教えください。 Mysql5.0.15で以下のテーブルを作成した時、数値の最大値(1010)を抽出したいのですがどのようにすれば抽出できるのでしょうか?お教えください。 テーブル名:B フィールド名,フィールドタイプ,備考 b_id,int(10),auto_increment b1,varchar(10) b_id,b1 1,999 2,1000 3,1000-1 4,1010 5,800 重ねて質問させてください。 select max(b1) from b;とした場合 999としか表示されません。 これもなぜなんでしょうか。

    • ベストアンサー
    • MySQL
  • PHPでMySQLに登録されているデータのMAXと他のフィールドからデータの取得

    PHPでMySQLの最新のデータを取得し、そのデータのデータ番号を取得しようとしています。 テーブルは ID(INT型、AUTO_INCREMINT) | name(VARCHAR型) | t_touroku(DATATIME型) 1 | test1 | 2005-12-1 12:11:10 2 | TEST2 | 2005-12-2 12:56:10 となっています。 ここから最新のデータt_tourokuを検索しそのデータのIDを取得したいのですが、どうにもうまいことできません。 この場合ですと、IDの2を取りたいんです・・・。 MAXを使えばいけると思ったのですが、最新のデータしか取得できずIDを取得できませんでした・・・。 どうか、お知恵を貸して下さい。 よろしくお願いします。 バージョンは PHP 4.3.10 MySQL 3.23.58 です。

    • ベストアンサー
    • PHP
  • データベースのフィールドのデータ型について

    くだらない質問で申し訳ありませんが宜しくお願いします。 下記のようなデータを格納するテーブルを構築しています。 ・ユーザーID ・名前 ・カタカナ ・パスワード ・年齢 ・郵便番号 ・住所1 ・住所2 ・住所3 ・電話番号 ・メールアドレス ・備考 ・削除フラグ ・登録者 ・登録日 ・更新者 ・更新日 上記の内容を下記のようなテーブルのフィールドのデータ型を考えました。 ・ユーザーIDのデータ型をVARCHAR(4) ・名前のデータ型をVARCHAR(32) ・カタカナのデータ型をVARCHAR(32) ・パスワードのデータ型をVARCHAR(255) ・年齢のデータ型をINTEGER ・郵便番号のデータ型をVARCHAR(8) ・住所1のデータ型をVARCHAR(255) ・住所2のデータ型をVARCHAR(255) ・住所3のデータ型をVARCHAR(255) ・電話番号のデータ型をVARCHAR(18) ・メールアドレスのデータ型をVARCHAR(255) ・備考のデータ型をTEXT ・削除フラグのデータ型をVARCHAR(1) ・登録者のデータ型をVARCHAR(4) ・登録日のデータ型をTIMESTAMP ・更新者のデータ型をVARCHAR(4) ・更新日のデータ型をTIMESTAMP そうしたら下記のような風にテーブルのフィールドのデータ型にしたら格納する文字列の桁エラーが起こらないからどうといわれました。 ・ユーザーIDのデータ型をVARCHAR(4) ・名前のデータ型をTEXT ・カタカナのデータ型をTEXT ・パスワードのデータ型をTEXT ・年齢のデータ型をTEXT ・郵便番号のデータ型をTEXT ・住所1のデータ型をTEXT ・住所2のデータ型をTEXT ・住所3のデータ型をTEXT ・電話番号のデータ型をTEXT ・メールアドレスのデータ型をTEXT ・備考のデータ型をTEXT ・削除フラグのデータ型をVARCHAR(1) ・登録者のデータ型をVARCHAR(4) ・登録日のデータ型をTIMESTAMP ・更新者のデータ型をVARCHAR(4) ・更新日のデータ型をTIMESTAMP ※現在、使用しているデータベースはPostgreSQLですが、Microsoft SQL ServerやOracleやMySQL等の他のデータベースでもいいものなのかもご教授いただけると助かります。 私の知識不足でどちらがいいのかがわからず投稿させてもらいました。 申し訳ありませんが皆さんのお知恵をお貸し下さい。 宜しくお願いします。

  • 変数内のデータをmysqlのデータベースへ書き込むサンプルなのですが、うまくinsertされません。

     回答者様たちのおかげで、mysqlをVC++から呼び出すことはできるようになりました。ありがとうございます。  ネットで拾ってきたサンプルを修正し、変数内のデータをtotalというテーブルに書き込んでいくプログラムを書いてみました。  しかし既存のテーブル内のデータは読み込み、表示はできるのですが、書き込みがうまくいきません。  以下、私が書いたソースです。 #include <cstdlib> #include <iostream> #include "windows.h" #include "mysql.h" MYSQL *mysql; MYSQL_RES *results; MYSQL_ROW record; static char *server_options[] = { "mysql_test", "--defaults-file=my.cnf" }; int num_elements = sizeof(server_options)/ sizeof(char *); static char *server_groups[] = { "libmysqld_server", "libmysqld_client" }; //メイン int main(int argc, char **argv) { //mysql_server_init(num_elements, server_options, server_groups); mysql = mysql_init(NULL); //mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "libmysqld_client"); //mysql_options(mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, NULL); char query[256]; int year = 2007; int manth = 2; int day = 2; int hour = 12; int min = 33; int group = 1; int man = 1; char name[] = "紙コップ"; int num = 1; int tanka = 900; int cre = 1; int check; memset(query, '\0', 256); mysql_real_connect(mysql, NULL,"root","パスワード", "rest", 0,NULL,0); if(mysql_errno(mysql) != 0) { fprintf(stderr, "Error: %s\n", mysql_error(mysql)); system("PAUSE"); return 0; } mysql_query(mysql, "SELECT * FROM total"); if(mysql_errno(mysql) != 0) { fprintf(stderr, "Error: %s\n", mysql_error(mysql)); system("PAUSE"); return 0; } results = mysql_store_result(mysql); if(results == NULL || mysql_errno(mysql) != 0) { fprintf(stderr, "Error: %s\n", mysql_error(mysql)); system("PAUSE"); return 0; } /* MYSQL_FIELD *fd; for(int i = 0; fd = mysql_fetch_field(results); i++) { printf("%d %s \n", i, fd->name); } while((record = mysql_fetch_row(results))) { printf("%s %s\n", record[0], record[1]); printf("%s, %s, %s \n", record[2], record[3], record[4]); } */ sprintf(query, "insert into total values (%d, %d, %d, %d, %d, %d, %d, %s, %d, %d, %d)",year, manth, day, hour, min, group, man, name, num, tanka, cre); mysql_query(mysql, query); mysql_free_result(results); mysql_close(mysql); mysql_server_end(); system("PAUSE"); return 1; } データベース名はrest  テーブル名はtotal です。 /**/でかこってある部分は、拾ってきたサンプルで、コメントを外し、 すでにデータが入っているテーブルを指定してやれば、 指定したテーブルのデータを引っ張ってくるので、VC++とmysqlが繋がっていないということはないと思います。 totalのフィールドの数も、書き込みたい変数の数と一致しています。 totalの各フィールドのタイプは、変数nameの紙コップを書き込みたいやつだけVARCHAR型でそれ以外はINT型です。 検索並び替え等はまだ考えてないのでKEY指定はしておりません。 ご指導よろしくお願いいたします。

  • MySQL関数max()を条件にSELECTできませんか?

    MySQL5.0を使っています。 次のようなテーブル(items)があるとします。 name(varchar)|number(int) --------------------------- itemA | 5 itemB | 2 itemC | 3 ここからnumberの最大値を持つnameを抽出したいのです。 SELECT max(number) FROM items とすると当然「5」が返ってきますが、このmax(number)を条件にしてitemを抽出することはできないのでしょうか? よろしくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • データ型について教えてください。

    データ型について教えてください。 あまり気にする必要がないかもしれませんが、テーブルにフラグ目的でフィールドを作る場合、 データ型は何するのが一般的なのでしょうか?(CHAR OR NUMBER?) ACCESSで言えばBOOLEANになると思うのですが、ORACLEやポスグレはないですよね? 私は、CHAR(1)にしています。 理由は、プログラムでSQLを書くときに''で囲むようにするためです。 その他のフィールドもだいたいテキストか日付ですので、''を囲むフィールドばかりです。 できるだけ''囲むフィールドに統一して、SQLの記述ミスを少なくしようというのが狙いです。 この考え方は間違っていますか?

  • 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のテーブル設計で迷っています(桁数)

    MySQLのテーブル設計で迷っています。 クリエイト文のカッコの中は桁数を表しているのでしょうか?それともバイト数でしょうか?桁数であれば、それぞれの型で何桁まで設定できますでしょうか? int型のnoを18桁に変更したいのですが、調べているうちに迷ってしまいました。 型 バイト 最小値 最大値 TINYINT 1 -128 127 SMALLINT 2 -32768 32767 MEDIUMINT 3 -8388608 8388607 INT 4 -2147483648 2147483647 BIGINT 8 -9223372036854775808 9223372036854775807 CREATE TABLE `user` ( `no` int(8) unsigned NOT NULL auto_increment, `id` varchar(24) NOT NULL default '', `email` varchar(255) NOT NULL default '', `reg_date` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`no`) ) TYPE=MyISAM;

    • ベストアンサー
    • MySQL