• ベストアンサー

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;

  • fabu
  • お礼率69% (384/554)
  • MySQL
  • 回答数3
  • ありがとう数9

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

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

#1さんの回答で、 >文字列型はバイト数ですが、数値型の場合は表示桁数です。 とありますが、MySQL 4.1を境に仕様変更されています。 char(10)の場合、 ~MySQL 4.0→10バイト MySQL 4.1~→10文字

fabu
質問者

補足

ご回答ありがとうございます。 文字型は文字数なのですね。数値型の桁数は以下であっていますでしょうか? TINYINT 3桁 SMALLINT 5桁 MEDIUMINT 8桁 INT 10桁 BIGINT 19桁

その他の回答 (2)

  • mahny
  • ベストアンサー率74% (57/77)
回答No.2

#1です。 > 例えば、こんなテーブルを作って… 試したらエラーでした。すいません。書き直します。 質問者様のテーブルを拝借して… CREATE TABLE `user` ( `no` int(8) unsigned zerofill 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`) ) ENGINE=MyISAM; これにデータを追加 INSERT user(id, email) VALUES('test-user', 'test@exsample.com'); 読み出す。 mysql> SELECT * FROM user; +----------+-----------+-------------------+---------------------+ | no | id | email | reg_date | +----------+-----------+-------------------+---------------------+ | 00000001 | test-user | test@exsample.com | 0000-00-00 00:00:00 | +----------+-----------+-------------------+---------------------+ 1 row in set (0.00 sec) ↑ゼロを追加されて'no'の内容を8桁表示になっている。テキストがズレているのは気にしない方向で…

fabu
質問者

お礼

ご回答ありがとうございます。 参考になりました。

  • mahny
  • ベストアンサー率74% (57/77)
回答No.1

> クリエイト文のカッコの中は桁数を表しているのでしょうか? > それともバイト数でしょうか? 文字列型はバイト数ですが、数値型の場合は表示桁数です。 カッコの数値を変えても記憶領域は変えられません。 数値型のカッコは主にZEROFILLと組み合わせて使われるようです。 質問の18桁の数値が保持したいなら素直にBIGINTを使うか、 verchar等の文字型で代用する事になると思います。 例えば、こんなテーブルを作って… CREATE TABLE `user` (  `no` int(8) unsigned zerofill NOT NULL auto_increment ) TYPE=MyISAM; INSERT user(no) VALUES(1); でデータを作った場合 SELECT * FROM user; +----------+ | no    | +----------+ | 00000001 | +----------+ 1 rows in set (0.00 sec) こんなんなります。また… INT unsign の上限は 4294967295 ですので INSERT user(no) VALUES(4294967296); はエラーになります。 保持できるデータ型の範囲は参照URLをどぞ。

参考URL:
http://dev.mysql.com/doc/refman/5.1/ja/data-types.html

関連するQ&A

  • MySQL データベースを選択したい

    こんにちは。 SQLの初歩的な操作で躓いています。 MySQL 3.23.51-nt (WondowsXP) を使用しています。 PHPベースの掲示板を作成していまして、次の一連の作業をしたいのですが、 ALTER TABLE phpbb_categories ADD cat_main_type CHAR(1); ALTER TABLE phpbb_categories ADD cat_main MEDIUMINT(8) UNSIGNED DEFAULT '0' NOT NULL; ALTER TABLE phpbb_categories ADD cat_desc TEXT NOT NULL; ALTER TABLE phpbb_forums ADD forum_link VARCHAR(255); ALTER TABLE phpbb_forums ADD forum_link_internal TINYINT(1) NOT NULL; ALTER TABLE phpbb_forums ADD forum_link_hit_count TINYINT(1) NOT NULL; ALTER TABLE phpbb_forums ADD forum_link_hit BIGINT(20) UNSIGNED NOT NULL; ALTER TABLE phpbb_users ADD user_sub_forum TINYINT(1) DEFAULT '1' NOT NULL; ALTER TABLE phpbb_users ADD user_split_cat TINYINT(1) DEFAULT '1' NOT NULL; ALTER TABLE phpbb_users ADD user_last_topic_title TINYINT(1) DEFAULT '1' NOT NULL; ALTER TABLE phpbb_users ADD user_sub_level_links TINYINT(1) DEFAULT '2' NOT NULL; ALTER TABLE phpbb_users ADD user_display_viewonline TINYINT(1) DEFAULT '2' NOT NULL; 上記をを打ち込んでもError 1046: No Database Selected と言われます。 そこでどのようにしてデータベースを選択する事が出来るのでしょうか? よろしくお願いいたします。

  • テーブル作成時に、「`id` int(100000000) 」とやるとエラーになるのはなぜ?対応策は?

    MySQLでint型は、 「符号付きの範囲は -2147483648 ~ 2147483647。符号なしの範囲は 0 ~ 4294967295」 と、本やサイトに書いてありますが、 create table時に、 桁数として1億を指定しようとしたら、 以下のように怒られてしまいました。 mysql> create table `page_master` (`id` int(100000000) not null,`lang` varchar(5) not null ,`is_top` tinyint(2) not null,`is_valid` tinyint(1) not null) type = innodb -> ; ERROR 1439 (42000): Display width out of range for column 'id' (max = 255) mysql> なぜこのようなことが起こるのでしょうか? また、対応策はありますでしょうか? 以上、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • どうしてもこのクエリーがミスになる

    Webmin上からテーブルを作成しようとしたら、以下のようにエラーになりました。 テーブルを作成できませんでした : SQL create table `page` (`page_id` mediumint(10000) not null,`title` varchar(100) not null,`descrption` varchar(500) not null,`keywords` varchar(100) not null,`parent_id` mediumint(10000) not null,`page_seq` int(100) not null,`createdate` datetime not null default 'now()',`modifydate` datetime not null default 'now()') が失敗しました: Display width out of range for column 'page_id' (max = 255) page_id はmediumint(10000)にしてるのに、なぜ「column 'page_id' (max = 255)」と言われてしまうのか不思議です。 どなたかおわかりのかたいらっしゃいましたら、お教えいただければ幸いです

    • ベストアンサー
    • MySQL
  • MySQLでのテーブル作成について

    はじめまして。私は学校でDBの勉強をするのにOracle10gを使っているのですが家で練習するにあたりOracleを入れれないのでMySQL5.0をいれてみましたが若干勝手が違いいろいろ調べながらやってみたもののテーブル作成の際の制約の決め方などがうまく作れません。特に外部キーで悩んでいるのですがどうすればよいか教えていただきたいのです。 mysql>CREATE TABLE MEIBO( SEITO_NBR INT(5) PRIMARY KEY NOT NULL, SEITO_MEI VARCHAR(80) NOT NULL, SEIBETSU_KBN CHAR(1), TANJO_YMD DATE, GAKKA_CD VARCHAR(2), BIKOU_TXT VARCHAR(1000), INSERT_DATE DATE, UPDATE_DATE ); mysql>CREATE TABLE GAKKA( GAKKA_CD VARCHAR(2) PRIMARY KEY NOT NULL, GAKKA_MEI VARCHAR(80) NOT NULL ); ちなみに下の学科表は作成できました。が上の名簿がうまくできません。長くなりましたがよろしくお願いします。

  • joomlaのインストールについて

    joomlaのインストールでmysqlのデータベース情報を入力し次へを押すと下記のメッセージがでます。 (インストール画面では無く、白いページに文字だけが表示されています) 接続は出来ていると思うのですが、どうしたらインストールを続けることが出来るのでしょうか? 【環境】 FreeBSD7 php5 mysql6 【メッセージ】 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 'TYPE=MyISAM' at line 29 SQL=CREATE TABLE `jos_banner` ( `bid` int(11) NOT NULL auto_increment, `cid` int(11) NOT NULL default '0', `type` varchar(90) NOT NULL default 'banner', `name` TEXT NOT NULL default '', `alias` varchar(255) NOT NULL default '', `imptotal` int(11) NOT NULL default '0', `impmade` int(11) NOT NULL default '0', `clicks` int(11) NOT NULL default '0', `imageurl` varchar(100) NOT NULL default '', `clickurl` varchar(200) NOT NULL default '', `date` datetime default NULL, `showBanner` tinyint(1) NOT NULL default '0', `checked_out` tinyint(1) NOT NULL default '0', `checked_out_time` datetime NOT NULL default '0000-00-00 00:00:00', `editor` varchar(150) default NULL, `custombannercode` text, `catid` INTEGER UNSIGNED NOT NULL DEFAULT 0, `description` TEXT NOT NULL DEFAULT '', `sticky` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0, `ordering` INTEGER NOT NULL DEFAULT 0, `publish_up` datetime NOT NULL default '0000-00-00 00:00:00', `publish_down` datetime NOT NULL default '0000-00-00 00:00:00', `tags` TEXT NOT NULL DEFAULT '', `params` TEXT NOT NULL DEFAULT '', PRIMARY KEY (`bid`), KEY `viewbanner` (`showBanner`), INDEX `idx_banner_catid`(`catid`) ) TYPE=MyISAM

    • 締切済み
    • PHP
  • SQLのSELECT文について

    以下の注文テーブルで、注文件数と送料と注文合計金額を一度に取得する場合、以下のようなSQL文で合っていますか? "SELECT order.total, order.delivery_fee, SUM(order.total * order.tax) AS total_for_paying FROM order"; CREATE TABLE `order` ( `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, `status` tinyint(3) UNSIGNED NOT NULL DEFAULT '0', `order_payment_status` tinyint(3) UNSIGNED NOT NULL DEFAULT '0', `buyer_id` bigint(20) UNSIGNED NOT NULL, `discount` INT(11) UNSIGNED NOT NULL, `delivery_fee` INT(11) UNSIGNED NOT NULL, `charge` INT(11) UNSIGNED NOT NULL, `total` INT(11) UNSIGNED NOT NULL, `tax` INT(11) UNSIGNED NOT NULL, `total_with_tax` INT(11) UNSIGNED NOT NULL, `total_for_paying` INT(11) UNSIGNED NOT NULL, `use_point` INT(11) UNSIGNED NOT NULL, `created` DATETIME NOT NULL, `updated` DATETIME NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

    • ベストアンサー
    • MySQL
  • phpMyadmin カラムの型、他

    始めたばかりの初心者です。 よろしくお願いします。 phpmyadminの事で質問があります。 ◇型の設定で、桁数を決める際にINTで(6)としても 試しに10桁を入れても(phpmyadminで直接) 入ってしまいます。試しにと思ってINTのところに ”あいうえお”を入れても入ってしまいます。 どういう事でしょうか? ◇またINTの上限数値って4294967295だとすると 桁数の設定は(10)までは意味があっても、(11)以上に しても意味がないのでしょうか? ◇INT(11)に上限数値の4294967295をいれると 何が起こるのですか? ◇最後にもうひとつ テーブル作成の際にphpmyadminの(sqlタブ)でつくるとき 以下のような記述をするとそのやり方を習ったのですが、  (サンプル)   Name` varchar(32) NOT NULL default '', この記述の意味がイマイチ理解しきれません。 NOT NULLとは、ヌル値は認めないというのに、 defaultは””(ヌル)で設定ができてしまう。って 矛盾してませんか?それとも私の解釈が間違っていますか? たくさん質問してしまいましたが、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQLでCREATE TABLE

    MySQLでCREATE TABLEをする際に、 プライマリキーを設定する場合は、 CREATE TABLE( AAA CHAR(5) NOT NULL, BBB CHAR(5) NOT NULL, CCC VARCHAR(10) NOT NULL, PRIMARY KEY(AAA) ); のようにすると思うのですが、「BBB」を外部キーにしたい場合は、どうしたらいいのでしょうか?

  • MySQL Date型にNULLが設定できない。

    csvファイルからMySQLにデータを取り込む際に、Date型やint型にNULLを設定するにはどうしたらよいでしょうか。 以下のようなテーブルに | tTest | CREATE TABLE `ttest` ( `ID` bigint(20) NOT NULL, `title` text NOT NULL, `naiyou` varchar(100) DEFAULT NULL, `kaishi` date DEFAULT NULL, `owari` date DEFAULT NULL, `peirod` bigint(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=sjis | 以下のようなcsvファイルを読み込んだとき(*)、 10,テスト,2008-04-05,2009-04-23,43 11,テスト,2008-04-05,NULL,43 12,テスト,2008-04-05,2009-04-23,NULL 2行目のNULLで ERROR 1292 (22007): Incorrect date value: 'NULL' for column .... とエラーが発生します。 3行目のNULLでもint型ですが同様にエラーとなります。 一方、insertで行の追加以下のようにした場合は成功します。 insert into tTest values (12,テスト,'2008-04-05',NULL,NULL) 外部ファイルから読み込んだ場合にNULL値を設定するにはどのようにしたらよいのでしょうか。 (*)以下のコマンド LOAD DATA INFILE "E:\\work\\MySQL\\sample.csv" INTO TABLE tTest FIELDS TERMINATED BY "," LINES TERMINATED BY "\r\n";

    • ベストアンサー
    • MySQL
  • 2つのテーブルからデータ取得

    いつもお世話になっております。 以下のようなテーブルがあります。 ---------- CREATE TABLE IF NOT EXISTS `students` ( `id` int(11) NOT NULL AUTO_INCREMENT, `student_number` bigint(20) DEFAULT NULL, `name` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ---------- CREATE TABLE IF NOT EXISTS `student_upload` ( `student_number` bigint(20) NOT NULL, `upload_id` int(11) NOT NULL ) ---------- データは以下のように登録されています。 students ---------- id|student_number|name 1 |11111     |いちろう 2 |22222     |じろう 3 |33333     |さぶろう student_upload ---------- student_number|upload_id 11111     |1 11111     |2 22222     |1 22222     |2 ---------- student_upload.upload_id=1 のデータを取得したいので 下記のようなSQL文を発行しているのですが、student_upload.upload_id=2 の データも取得されてしまいます。 select * from students s, student_upload up where up.upload_id=1 and up.student_number=s.student_number よろしくご教示お願いいたします。 <環境>  PHP:5.3.5  MySQL:5.0.7

    • ベストアンサー
    • MySQL