
データベースとしては基本的な話になると思いますが、ご返答よろしくお願いいたします。
例えば日本人の名前はどう考えてもせいぜい漢字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で質問しましょう!
似たような質問が見つかりました
- 政治 私が岸田文雄外相にこの問い合わせのメールを投稿しました。 8 2022/11/24 07:56
- 日本語 漢字の書きについてです。 けっこう前のテストを見直していたら、 「チョウテンがダメでも私が慰めてあげ 1 2022/04/11 20:32
- 環境・エネルギー資源 停車中の自動車のヘッドライト点灯 23 2023/03/01 10:14
- 大学・短大 名前のふりがなの書き忘れについて 6 2022/07/30 04:39
- その他(ニュース・社会制度・災害) 出生前診断や遺伝子検査については様々な意見がありますが、皆さんは賛成反対のどちらですか? 2 2022/04/10 19:48
- その他(スマートフォン・携帯電話・VR) 文字が大きいスマホ ソニー(エクスペリア) 80代が使用 6 2023/06/08 10:49
- 式場探し・ウェディングドレス・結婚準備 弟の結婚式の前日に入籍する場合 5 2023/05/06 18:44
- 物理学 大学で物理学を学んでいる人、大学で物理を学んでいた人へ質問です。 私は現在大学1年で、物理を学んでい 2 2022/10/03 20:00
- その他(IT・Webサービス) 皆さんの意見をお聞かせください 先日犬の写真と名前をプリントするネックレスを購入しました。 コインの 1 2023/06/01 12:09
- 中途・キャリア グタグダ面接だったのに内定を貰いました。 5 2022/05/27 10:13
このQ&Aを見た人はこんなQ&Aも見ています
-
varchar型の入力できる最大文字数について
SQL Server
-
テーブルに主キーを作らないデメリットは?
その他(Microsoft Office)
-
SQLServer2008での1レコードバイト数の上限を増やしたい
SQL Server
-
-
4
データベースのINT型項目にNULLはNG?
MySQL
-
5
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
6
【C#/Java?】try-catchでcatchせずにfinallyは一般的?
その他(プログラミング・Web制作)
-
7
CloseとDisposeの違い
Visual Basic(VBA)
-
8
Viewにインデックスは張れますか?
Oracle
-
9
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
10
visual studio でインデントを自動的に揃えるショートカットキー
その他(プログラミング・Web制作)
-
11
Excelでセルに入力されたカラーコードを背景色にしたいです。
Excel(エクセル)
-
12
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
13
ビューにインデックスを設定できませんか?
SQL Server
-
14
select文の実行結果に空白行を入れたい
MySQL
-
15
SQLServerで文字列の末尾からある位置で取出
SQL Server
-
16
C# ReadOnlyのTextBoxで
C言語・C++・C#
-
17
MS SQLServer のSQLで文字列の前にN:
その他(データベース)
-
18
副問合せの書き方について
SQL Server
-
19
GROUP BYを行った後に結合したい。
Oracle
-
20
IFで条件を分岐させてのINSERT(ストアド)。
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DBの定義のサイズを大きくし過...
-
SQL、oracleにて文字列操作(連...
-
INDIRECT関数の代替方法は?
-
SELECT文で、指定カラム以外の...
-
type date にnullをinsert
-
mysqlで50音順にorder byしたい。
-
UNIONする際、片方テーブルしか...
-
MYSQLで全てのカラムから検索す...
-
ドロップダウンリストの連動し...
-
SQLServerでNULLを挿入したいです
-
now()かCURRENT_TIMESTAMPか
-
SQLでカラムを追加し、条件に合...
-
一部のカラムでdistinctし全て...
-
【Transact-sql】 where条件、i...
-
スペースによる絞り込み検索をS...
-
GREATESTで NULLをスルーする方...
-
複数カラムに対するLIKE文の最適化
-
巨大テーブルからインデックス...
-
select * での表示が崩れる?
-
MySQLで先頭にカラムを追加
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DBの定義のサイズを大きくし過...
-
mySQL プライマリーキーのカラ...
-
SQL、oracleにて文字列操作(連...
-
PHPのforeachでSQL文を処理して...
-
(phpMyadminの)インデックスサ...
-
インデックスキーを設定するとK...
-
効果的なindexの設定方法
-
'PRIMARY KEY'と'UNIQUE()'の違...
-
SELECT文で、指定カラム以外の...
-
INDIRECT関数の代替方法は?
-
一部のカラムでdistinctし全て...
-
SQLServerでNULLを挿入したいです
-
UNIONする際、片方テーブルしか...
-
BULK INSERT時のNull許容について
-
MYSQLで全てのカラムから検索す...
-
AUTO_INCREMENTに0はダメ?
-
【Transact-sql】 where条件、i...
-
group byで最後のレコードを抽...
-
GREATESTで NULLをスルーする方...
-
テーブルの列数を調べたい
おすすめ情報