
データベースとしては基本的な話になると思いますが、ご返答よろしくお願いいたします。
例えば日本人の名前はどう考えてもせいぜい漢字10文字で収まるため、名前を入力するためのDB定義は、nvarchar(20)などと少し大きめに設定すると思います。私もこれまでは当たり前のようにそうしてきました。
しかし、nvarchar型の最大サイズは4000なので、全ての項目でnvarchar(4000)としてしまえばいいような気がするのですが……誰もしてないところを見るとやはり何か問題があるのでしょうか?それはどんな問題なのでしょうか?
No.3ベストアンサー
- 回答日時:
SQL Serverの話ですよね?
> ntextの代わりにnvarchar(4000)を使う
そういうことでしたらそうしてください。
ただし、インデックスに使わないのであればnvarchar(max)の方がよいでしょう。
http://technet.microsoft.com/ja-jp/library/ms187 …
> ntext 、text、および image の各データ型は、将来のバージョンの Microsoft SQL Server で削除される予定です。
(中略)
> 代わりに、nvarchar(max)、varchar(max)、varbinary(max) を使用してください。
で、本題の「nvarcharを使うときはとりあえずnvarchar(4000)でいいんじゃないか?」という話ですが、
1列または1レコードのサイズが大きすぎるとこんな落とし穴があるようです。
クエリ関連
http://msdn.microsoft.com/ja-jp/library/ms345371 …
キー・インデックス関連
http://technet.microsoft.com/ja-jp/library/ms163 …
http://technet.microsoft.com/ja-jp/library/ms143 …
このあたりのことも理解した上でサイズを決めた方が良さそうです。
この回答への補足
あ、すみません、SQLServer2003での話でした。
2003だからなのかわかりませんが、
私の環境では(max)というのは使えないようです……
No.2
- 回答日時:
・1レコードに対する格納領域がそれだけ必要になる。
(たった20バイトしか入らないのに、領域としては4000バイト確保する羽目に)
・インデックスに係る領域がそれだけ必要になる。
今回、ntextの代わりにnvarchar(4000)を使うことで問題があるのかなと思って質問しました。領域というのは、SQLサーバのメモリのことでしょうか?それともストレージですか?ntextだと領域はどれくらい確保するのでしょうか?
No.1
- 回答日時:
>nvarchar型
それが当たり前のデーター型だとは知らなかったが、逆になんでデーターベースにデーター型があるか、ご存知でしょうか?
JavaScript言語みたいに、何でも格納出来た方が便利だと思いますけどね。その辺まるっきり考えた事無いでしょう。
よく言われるのが、通貨型と言うデーター型。これが在ると無いとでは、販売管理ソフトの設計が違ってくる。当然、ATMなどの金融系は無いとこまる。
では、なぜあった方が便利なのか? それは、通貨計算が便利だからです。また、時間などでもそうですが、フォーマットに合わないデーターはDB側で拒否できるからです。そうするとDBの信頼性が上がるわけです。
今みたいに、計算にほぼくらいが無い時代ならともかく、1960年代の頃は、DBの信頼性はそんなに高くありませんでした。それはチップ自体の信頼性が今ほど高い物ではなかったからです。なので、アポロ11号は科学的に、到達していない。と言う結論を出す科学者もいます。
何せ、あの時代のLSIの信頼性はとても低く、振動とGに絶えられる物ではなく、その信頼性を上げたのがアポロ計画だった、と言われるくらいでしたね。今では当たり前になっている、基盤を樹脂で固めるなんて事を、その計画があったか生まれたような物です。それで、誤計算がなくなったと言えます。
型を決めて、大きさを決める。このことのよって、底辺でデーターの整合性を図る事ができる。大きさが決まっていないと、プログラムにより、抜け道があった場合、違うデーターが誤って格納されてしまうわけです。これは、例えば文字化けした物がはいった場合、これをチェックする機能がプログラムに無いと、そのままDBに登録してしまうわけです。
しかも、大型のシステムだとAPI、SPI化され、いろんな経路をとおってDBにアクセスされます。設計管理者の思惑とは違うソフトでDBにアクセスされてしまうわけです。そこでDBに最初から決まりごとがあれば、はじく事ができる。
あなたのように個人レベルならいいが、大型のDBには、まったく知らない人がアクセスします。そのアクセスはエンドユーザーレベルではなく、管理者レベルでアクセスするわけです(ソフト開発者)。例えばATMですよね。
それと、多くのDMBSは最初からメモリーバッファーを用意しますが、最適化すると、DBエンジンのメモリーの使い方も代わってきます。それらはチューニングのカテゴリーになりますが、業務用の(ATMとか)DBになると、1文字のメモリー使いでも、きにしないと、パフォーマンスにしびあに影響します。1日に何十万アクセスのDBを扱うようになれば、わかると思います。また、100万レコード以上のDBを扱えばわかるかと。
この回答への補足
今回、ntextの代わりにnvarchar(4000)を使うことで問題があるのかなと思って質問しました。なので統合性については考える必要がありません。
補足日時:2013/10/25 14:06お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
varchar型の入力できる最大文字数について
SQL Server
-
テーブルに主キーを作らないデメリットは?
その他(Microsoft Office)
-
Viewにインデックスは張れますか?
Oracle
-
-
4
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
5
CloseとDisposeの違い
Visual Basic(VBA)
-
6
SQLServer2008での1レコードバイト数の上限を増やしたい
SQL Server
-
7
データベースのINT型項目にNULLはNG?
MySQL
-
8
Excelでセルに入力されたカラーコードを背景色にしたいです。
Excel(エクセル)
-
9
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
10
一つのテーブルだけを復元(リストア)する方法を教えてください
SQL Server
-
11
【C#/Java?】try-catchでcatchせずにfinallyは一般的?
その他(プログラミング・Web制作)
-
12
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
13
C# ReadOnlyのTextBoxで
C言語・C++・C#
-
14
SQLサーバに対するSQL文で抽出した時にないレコードを0で表示させるには?
SQL Server
-
15
Dirコマンドでフォルダ内ファイルの合計サイズをだすには?(コマンドプロンプトにて)
UNIX・Linux
-
16
GROUP BYを行った後に結合したい。
Oracle
-
17
update文で改行を入れる
Oracle
-
18
SQLServer2005のSQL文での別名の取り扱い
SQL Server
-
19
アクセスで数値型のフィールドにNullをいれたい
その他(データベース)
-
20
SQLServerでNULLを挿入したいです
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DBの定義のサイズを大きくし過...
-
SQL、oracleにて文字列操作(連...
-
mySQL プライマリーキーのカラ...
-
他のシートの検索
-
INDIRECT関数の代替方法は?
-
SELECT文で、指定カラム以外の...
-
一部のカラムでdistinctし全て...
-
BULK INSERT時のNull許容について
-
ドロップダウンリストの連動し...
-
テーブルの列数を調べたい
-
betweenを使うyyyy/mm/ddでの範...
-
LIKEの右側にカラムを指定でき...
-
カラムとコラムの使い分け
-
ホームページを作ろうと思いま...
-
MYSQLで全てのカラムから検索す...
-
now()かCURRENT_TIMESTAMPか
-
sql , insert で空行(全ての列...
-
MySQL 一つのテーブルで登録日...
-
Accessで複数(3以上)...
-
WHEREなどの条件が多い場合、ど...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DBの定義のサイズを大きくし過...
-
PHPのforeachでSQL文を処理して...
-
SQL、oracleにて文字列操作(連...
-
ENUM列に列挙されていない値を...
-
インデックスキーを設定するとK...
-
mySQL プライマリーキーのカラ...
-
SQL Serverのntext型で一意イン...
-
SQLの高速化の方法について
-
パフォーマンスとIN句とAND、実...
-
効果的なindexの設定方法
-
(phpMyadminの)インデックスサ...
-
'PRIMARY KEY'と'UNIQUE()'の違...
-
属性?について
-
コンポジット一意インデックス...
-
インデックスの一意な値の数に...
-
インデックスを用いたbetween検...
-
Mysqlのconstraintについて教え...
-
他のシートの検索
-
SELECT文で、指定カラム以外の...
-
INDIRECT関数の代替方法は?
おすすめ情報