• ベストアンサー

データ型について

DBを設計する際のデータ型について質問があります。 1.文字、varcharとnvarchar 2.数値(小数点あり)、floatとreal 3.日付、datetimeとsmalldatetime 4.通貨、moneyとsmallmoneyがありますが  smallintやintとどう違うのか。 DBを設計する上でどちらを選んだ方がいいのか 検索でデータ型の仕様は確認しましたが 使い分けのやり方がよく分かりません。 それぞれのメリットやデメリット またはそういう事が乗ってるサイトなどありましたら どんな些細な事でも構いませんので教えてください。

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

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

1.nvarcharはunicodeで保存されます。半角英数字でも2バイト必要になります。単言語の登録ではそれぐらいしか差がないと思います。多言語になると違うかも。 2.これは分りません。ごめんなさい。 3.DB内で使用するバイト数が2倍違います。smalldatetは2079 年 6 月 6 日までしか登録できません。 4.使用するバイト数が違います。 1バイトであらわされる、tinyint 2バイトであらわされる、smallint 4バイトであらわされる、int 当然、保存できる桁数が違います。 保存される最大値とディスク使用量の相談になると思います。

noname#7416
質問者

お礼

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

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

関連するQ&A

  • PHPとMYSQL、DBのデータが空の表現は0が良

    こんばんは。 MYSQLではint型、varchar型、text型、smallint型、tinity型、float型で データが無いことを表すのはnullでも構わないですよね。 そのときPHPでMYSQLからデータを受け取ってデータが空かどうかを区別するには、 if(!a==null){}のようにnullを使うことになります。 PHPでnullを扱うのはトラブルの元になると参考書に書いてありました。 そういうときは、MYSQLでnullじゃなくて0が一番無難でしょうか。 また、0よりも半角文字や「データ無」のようにするべきですか。

    • 締切済み
    • PHP
  • 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
  • データが追加されません

    mysql2.23 + PHPのプログラムで あらかじめ次のようなテーブルを作っています。 CREATE TABLE metadata(id smallint unsigned not null auto_increment primary key, me_date datetime, me_info text, me_file varchar (50)); 次にPHPで $meta_server = "metadata"; $conn = mysql_connect("localhost","root","root"); とここまでは大丈夫なのですが、その後 $sql = "INSERT INTO metadata(me_date, me_info, me_file) VALUES( '".substr$table', '".$note."', '".$filename."');"; $db = mysql_db_query($meta_server,$sql); としてもデータがテーブルに入りません。 どこに問題があるのでしょうか? 誰かヒントをお願いします。

  • ストアドでVB.NetのDataGridにDataTime型のデータの時間だけを返したいです。

    DBはMSDE。 肝心のフィールドはTimeでDateTime型で、以下のようなデータがあります。 Time 5:00:00PM 5:30:00AM . . これをストアドで返します。普通に SELECT Time ... 以下略。 クライアント側、sqlCommand -> パラメタ の設定 -> sqlDataAdapter -> DataSetにエントリを返し -> DataGrid1.DataSource = DataSet.Tables(0) これで、実行すると、返ってくる値は すべて 30/12/1899 となります。時間の部分は何も出ません。これはDB側に、日にちを入れてないので出てくるデフォルト値と思われます。 次に、前の SELECT文に CAST(sql_variant、Time) を加えると、30/12/1899 5:00:00PM と出ますが、sql_variant型なので、SABSTRINGで切れません、上のCAST文にさらにCONVERT(Varchar(30),,)をかぶせると、30/12/1899 に戻ってしまいます。 今まで試した方法は、 CONVERT(Varchar(30),Time,108) CONVERT(Varchar(30),Time,8) CONVERT(char(30),Time,108) CONVERT(Varchar(30),Time) EXTRACT (Time.....) 等などあらゆる方法(データ型のバリエーションを含む)を試みましたが、返されのは30/12/1899ばかりです。 DateTimeはDB側で比較のクエリに使用するのでをVCharに変えることはできません、Timeのデータにダミーの日にちを付け加えたくもありません。 なんとか時間だけを取る方法をご教授ください。お願いします。

  • アクセスからのデータインポート時のエラーについて

    AccessのデータをSQLサーバーにインポートする時のエラーについて教えてください。 Accessのあるフィールドだけうまくインポートできません。そのフィールドは、Access側がデータ型が整数型、フィールドサイズが単精度浮動小数点型、SQLサーバー側がVARCHAR(128)です。ちなみに、numeric、float 、realでもだめでした。 SQLサーバーの「データのインポート」でインポートを行っています。インポートは正常に終了しました。とメッセージがでるのですが、データをみてみると、どうやらオーバーフローしてしまっている感じです。データが2.8197898E-2といった形になってしまっています。ちなみに、アクセスの場合はこの値は、0.0281979というデータです。 どのようにしたら正常にインポートできますでしょうか。

  • 型のチェック

    CSVデータをテーブルに追加していくのですが、 そのCSVデータが信用できるものではないので、 チェックをしていかなければなりません。 その値をテーブルに追加したときにエラーでないか一発でわかるようなものはないでしょうか? ISNumericはその値を数値として評価できるかどうかを調べてくれますよね、 それみたいにmoney型 int型 smallint型 … として評価できるかどうかを調べてくれるようなものはありませんか?

  • インデックスを張るべき項目について

    20万件レコードのあるテーブルに、インデックスを張ると INSERTが遅くなるので、WHERE句で検索する項目のどれに インデックスを張るか悩んでいます。 インデックスはパターンが多い程、張った場合に 検索速度が向上すると理解しているのですが正しいでしょうか? であれば、下記1.だけは貼ろうと思っているのですが・・ 1.カラムに入るデータが殆どバラバラのVARCHAR(30) 2.カラムに入るデータは10万パターンのINT型 3.カラムに入るデータは1万パターンのINT型 4.カラムに入るデータはdatetime型 インデックスを張る事でINSERT速度が何%ぐらい下がるでしょうか? よろしくお願いします。

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

    今、SQLSERVER上に5200万行ほどのレコードを保持しているテーブルがあるとします。 クエリアナライザで検索条件を指定して検索しても 1時間ほどかかります。 そこでインデックスというものを追加したいのですが、 データ数が多いのか、うまくいきません。 どなたか教えて下さい。 ● hizuke | datetime ● name | varchar count | int area | varchar ●の部分にインデックスを付加したいと考えています。

  • 共有体でfloat型の数値を2進数へ変換

    実行結果が思ったとおりの値を算出しません。 なぜでしょうか? 回答のほどよろしくお願いいたします。 (例) 小数入力 >5.0 0000 0000 0000 0000 0100 0000 1010 0000 小数入力 >-5.0 0000 0000 0000 0000 1100 0000 1010 0000 (下記ソース) #include<stdio.h> void float_binary(float a); void main (void) { float fl; printf("小数入力 >"); scanf("%f",&fl); float_binary(fl); } void float_binary(float a) { struct float_data{ short int high_byte; short int low_byte; }; union data{ float num; struct float_data bit; }DATA; int i; DATA.num = a; for(i = 0; i<16; i++){ if(i != 0 && i % 4 == 0){ printf(" "); } if(DATA.bit.high_byte < 0){ printf("1"); } else{ printf("0"); } DATA.bit.high_byte = DATA.bit.high_byte << 1; } for(i = 0; i<16; i++){ if(i % 4 == 0){ printf(" "); } if(DATA.bit.low_byte < 0){ printf("1"); } else{ printf("0"); } DATA.bit.low_byte = DATA.bit.low_byte << 1; } }

  • csvをDBへ読み込んだら、NULLが勝手に0に

    csvファイルをMySQLへ読み込んだら、空白のところが勝手に0に置き換わってしまいました。 置き換わったカラムの型が、全部INTだったので、 試しにVARCHARへ変え、再度、取り込み処理を実施してみたところ、 希望通りに(空白のところは空白のままで)無事データを取り込むことが出来ました。 ■質問1 考えられる原因としては、DBの設定? それとも、PHP側の書き方でしょうか? ■質問2 データ型を決める際、数字はINT、文字列はVARCHAR、ぐらいの認識しかないのですが、 今回のように、INT型のカラムを、VARCHAR型に、変えたりすると、 起こり得るリスクとしては、どのようなものが考えられでしょうか? ■質問3 DBのデータ型が、「INT」と「VARCHAR」では、PHP側の書き方も変わってくるのでしょうか? □PHPの内容 ▽まず、UTF-8形式で上書き exec("nkf -w --overwrite data.csv"); ▽接続後読み込み $sql = "LOAD DATA LOCAL INFILE '$file' INTO TABLE `読み込むテーブルの名前` FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\' LINES TERMINATED BY '\\r\\n'";

    • ベストアンサー
    • PHP