データを扱う上で必ずデータの型と言うのがでてきます。
実際、SQLserverで自分が扱おうとしているデータに対してどの型を使ったらいいのか?悩みますよね。
備忘録としてまとめてみました。
様々なデータ型
種別 | データ型 | 説明 | サイズ(バイト) |
---|---|---|---|
整数型 | tinyint | 0 ~ 255 の範囲の数値 | 1 |
smallint | おおよそ -3万 ~ 3万の範囲の数値 | 2 | |
int | おおよそ -20億 ~ 20億の範囲の数値 | 4 | |
bigint | おおよそ -900京 ~ 900京の範囲の数値 | 8 | |
小数 (真数型) |
decimal(p, s) | p:全体桁数 s:小数点以下桁数 固定長の有効桁数と小数点以下桁数を持つため誤差は発生しない(10進数) |
5 ~ 17 |
numeric(p, s) | |||
小数 (概数型) |
float(n) | n:仮数のビット数 浮動小数点数 | 4 ~ 8 |
real | 浮動小数点数 | 4 | |
文字列 | char(n) | 固定長文字列(8000バイトまで) | n |
varchar(n) | 可変長文字列(8000バイトまで) | 実際のバイト数 + 2 | |
varchar(max) text |
可変長文字列(2GBまで) | ||
Unicode文字列 | nchar(n) | Unicode固定長文字列(8000バイトまで) | 2n |
nvarchar(n) | Unicode可変長文字列(8000バイトまで) | (実際のバイト数) * 2 + 2 | |
nvarchar(max) ntext |
Unicode可変長文字列(2GBまで) | ||
日付 | smalldatetime | 精度:1分 | 4 |
datetime | 精度:3.33ミリ秒 | 8 | |
date | 精度:1日 | 3 | |
time | 1日の時刻のみを格納し、精度は100ナノ秒 | 3~ 5 | |
datetime2 | 精度:100ナノ秒 | 6 ~8 | |
datetimeoffset | 精度:100ナノ秒 タイムゾーン付き | 8 ~10 | |
金額・通貨 | smallmoney | 金額や通貨を表す(範囲狭) | 4 |
money | 金額や通貨を表す(範囲広) | 8 | |
バイナリ | binary(n) | 固定長バイナリデータ(8000バイトまで) | n |
varbinary(n) | 可変長バイナリデータ(8000バイトまで) | 実際のバイト数 + 2 | |
varvinary(max) image |
可変長バイナリデータ(2GBまで) | ||
その他 | bit | 1, 0, NULL のどれか | 1 |
table | SELECT文実行結果のテーブルを格納可能 | 実際のデータ量 | |
XML | XMLデータを格納可能 | ||
uniqueidentifier | 16バイトのGUID(グローバルユニークID) | 16 | |
timestamp (rowversion) |
テーブルのデータが更新される度に加算されるカウンタ(行バージョンを格納) | 8 | |
sql_variant | 複数のデータ型を格納可能 | 実際のバイト数 |
データ型 | 使用する サイズ (バイト数) |
扱える数値の範囲 |
---|---|---|
tinyint | 1 | 0 ~ 255 |
smallint | 2 | -32,768 ~ 32,767 (おおよそ -3万から3万) |
int | 4 | -2,147,483,648 ~ 2,147,483,647 (おおよそ -20億から20億) |
bigint | 8 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (おおよそ -900京から900京) |
よく使いそうなデータ型の分類
●char
固定長の半角文字列を格納。
(数字ですが)JAN コードや、空港コードなど。
●nchar
固定長の全角文字列を格納。
いい例が思いつきませんが、例えば会社の部署全てに漢字 2 文字の略称(営管、開1、等)を付与している場合。
●varchar
可変長の半角文字列を格納。
英語の商品名や、ローマ字の氏名など。
●nvarchar
可変長の全角文字列を格納。
日本語の商品名や漢字の氏名、日本語でのメモなど、日本語環境では使用頻度が高いと思われます。
名称は、以下のような規則になっています。
char/nchar ⇒ 固定長
varchar/nvarchar ⇒ 可変長
n付 ⇒ Unicode 対応(全角文字がある場合に推奨)
n無 ⇒ ASCII 対応(半角英数字記号)
テーブルのデータ型の変更
既に作成してしまったテーブルのデータ型を変更したい場合がありますよね。
データが入力されてない状態なら簡単に変更できますが、既に入力してあるテーブルなどのフィールドのデータ型を変えるには、
alter table (テーブル) alter column (フィールド名) (変更データ型)
で変更できるようです。
もちろん、文字列を無理やり違うデータ型にしたりするとエラーが出ますので、既に入力済のデータが変更後のデータ型でも使えるようなデータ内容でないと変換は無理ですね。