テーブルのカラムで、2005という文字を格納したい場合、
属性として、NUMBER型、CHAR型の選択ができると思います。
●テーブル名 TABLE1
カラム名 A B
属性 ??? char
データ 2005 XXXX
●テーブル名 TABLE2
カラム名 A C
属性 ??? char
データ 2005 XXXX
このカラムAが、TABLE2のAの2005という値と結合させる
(結合させるためのキーとなっている場合)
ということがある場合、NUMBER型での定義とchar型での定義に
速度的な観点やその他の観点で、なにか差異みたいなものはありますでしょうか?
下記のように、値を指定するところでは、シングルコーテーションが必要か不必要かというのは、あるかと思いますが、
結合自体で、差異はありますでしょうか?
■CHAR型にした場合。
select * form TABLE1,TABLE2
where A='2005'
and TABLE1.A=TABLE2.A
■NUMBER型
select * form TABLE1,TABLE2
where A=2005
and TABLE1.A=TABLE2.A
No.3ベストアンサー
- 回答日時:
No.2への回答です。
> 片一方は、CHAR型、もう片方は、VARCHAR2であるというのは、
> 避けたほうが良いということでしょうか?
型違いはできるだけ避けた方が良いかと。
CHARとVARCHAR2は固定長か可変長かの違いがありますので
比較条件に指定した場合、意図しない結果となる場合があります。
例えばCHAR(3)の列とVARCHAR2(3)の列に'A'という文字が
格納されていて、それらを比較しようとした場合ですね。
CHAR型は'A 'という文字列に、VARCHAR2型は'A'という文字列になり
これらを比較した結果、一致ぜず…という事になります。
片方がNUMBER型、もう片方がCHAR型もしくはVARCHAR2型である場合は
比較を行うと一致はしますが、No.2で書いた通り型変換が行われる分だけ
性能面で影響がでてきます。
No.4
- 回答日時:
型違いのデータを結合・比較・その他の処理をするときには、当然、どちらかの型に他方を「変換」するわけです。
今回のcharとvarcharの事例ですと、固定長の文字列と可変長の文字列間の変換となります。
OLACLE上でどちらがどちらに変換され、どのように扱われるかは、No3の方も一部事例をかかれていますように、厳密に定義されています。
さて、この規約をちゃんと正確に覚えているプログラマーは立派です。少なくとも、私は自信がありません。必要なときには、必ずマニュアルの該当箇所を確認します。(これがましてや、NUMBERとVARCHAR(または、CHAR)となったら、徹底したテストもしたい(苦笑))
つまり、とっても面倒です。
世の中、どうしても、その必要があり、必要に迫られて型変換をせざるを得ないことは往々にしてありますが、今から設計するシステムでその必要がないなら、そんなモノはしないのが一番です。プログラムを作成し、修正していく課程で他に考えなくてはいけないことはたくさんあります。なにも、よけいな心配を増やす必然性はさらさらありません。というか、よけいな心配事を一つでも減らしていけるように、データ型というのは設計していくべきでしょう。
ですから、結論としては、どうしても型違いでなければならない理由が無いのであれば、型は同じにしておくべき。となるでしょうね。
ちなみに、NUMBERとCHAR(VARCHAR)の選択に関しては、利用用途によっては、まだ他にも考慮点が思いつきます。
もし、その列でソートするとき、2005と305は、どちらが大きいですか?といった話がプログラム作成に負荷をかける可能性があります。当然、数値としては2005ですが、文字列として考えると、桁あわせをどうするか等いろいろと考える必要があります。本当に、この数字が文字列なら、どちらが大きいかは、「業務の定義による」というのが正解ですし…。
基本的には、その項目で計算をするかどうかと言うよりは、業務としての定義上、その項目が数・数値なのか、それとも、0~9までの文字を使用した文字列(符号)なのか、そのどちらかによって決定するのが、経験上、プログラムもシンプルになるように思います。
蛇足ですが、業務上の定義によっては、それは、DATE型ではありませんか?というのも一つの選択肢としてあり得るかと。
No.2
- 回答日時:
こんにちは。
私も No.1 PCFREAK様と同意見です。
(なのでポイント辞退。
同じ意見の人が同じ事を書いてるな…くらいに考えてくださいな^^;)
結合時、TABLE1のカラムAとTABLE2のカラムAの型が
それぞれ違った場合は、暗黙の型変換が生じますので影響があります。
しかし今回の場合は同じ型という事で差異がありません。
型の違いによる差異ですが
固定長より可変長の方がサイズが小さい
↓
全体的にレコードを格納するブロック数が少なくなる
↓
読み取り時のブロック数が少なくなり、読み取り性能に差が出る
という考えです。
今回はデータサイズにほどんど差がないため影響がない程度と思います。
あと…
キー項目には、連番以外の目的でNUMBER型を使うとアプリ開発者側に
色々と誤解を生じさせてしまう事があるので、私も使わないようにしてます。
回答ありがとうございます。
型の違いによる差異について、もう少しお教え願えますでしょうか?
片一方は、CHAR型、もう片方は、VARCHAR2であるというのは、
避けたほうが良いということでしょうか?
No.1
- 回答日時:
結合自体には差がありません。
速度的には、若干NUMBERの方が速いのではと予想出来ますが、ほぼ無視できる差だと思われます。
どちらを採用するかは設計思想に依存しますね。
数値として取り扱うのであればNUMBER型ですが、文字として扱うのであればCHAR型を使うのが正でしょう。
私個人的にはキーにNUMBER型を使うのは極力好ましくない(特別な理由があるのであれば別ですが。)と考えている為、CHAR型(厳密にはVARCHAR2型)を採用する事が多いです。
回答ありがとうございます。
その値を使って計算させるわけではないので、CHAR型にしようと思います。
PCFREAK様は、キーにNUMBER型を使うのは極力好ましくないとありますが、
それは、なんでなのでしょうか?
また、「厳密にはVARCHAR2」とおっしゃってますが、
それは、なにか意図があるのでしょうか?
知識不足で申し訳ありませんが、よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle データベースのカラムの型がCHAR型の場合で 値にシングルコーテーションつけなくても動作する場合と数 3 2022/04/25 12:00
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Excel(エクセル) Excel2007での条件付き書式について 6 2023/05/02 10:56
- その他(アニメ・マンガ・特撮) 腐女子ってマナーが悪いですよね? 2 2023/04/10 17:56
- 物理学 波の合成についてです E1(z,t)=A0cos(kz-ωt+Φ) E2(z,t)=A0cos(kz 1 2022/10/10 06:35
- 工学 ちなみになぜv=(v・e1)e1+(v・e2)e2はe1やe2が、正規直交基底でないと成り立たないと 2 2022/12/22 17:22
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Excel(エクセル) エクセルでのVBA 2 2022/08/03 06:48
- カスタマイズ(車) 2003年式レガシィB4 2.0GT TA-BL5に乗ってるのですが このマイルドダンパーという車高 2 2023/06/11 22:09
- IT・エンジニアリング ドメイン駆動設計の値オブジェクトについて質問 1 2023/05/13 02:50
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
「マスタ」と「テーブル」の違いとはなんでしょうか?
Oracle
-
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
-
4
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
5
単一グループのグループ関数ではありません。
Oracle
-
6
count(1)とcount(*)の違い
Oracle
-
7
データベース関係で、データの洗い替えとはどのような事を行うことでしょう
IT・エンジニアリング
-
8
Winmerge ファイルの中身は同じなのに黄色くなる
その他(OS)
-
9
Oracleのデータ型、NUMBERについて
その他(データベース)
-
10
Oracle 2つのDate型の値の差を「分」で取得したい
その他(データベース)
-
11
SELECTで1件のみ取得するには?
Oracle
-
12
NUMBER(N,M) としたときの、格納データサイズ(バイト)
Oracle
-
13
ウォッチ式の文字数制限について
Visual Basic(VBA)
-
14
CASE文のエラーについて
Oracle
-
15
【SQL】他テーブルに含まれる値に合致する行を抽出
その他(データベース)
-
16
group byの並び順を変えるだけで結果が異なる
Oracle
-
17
テーブルに主キーを作らないデメリットは?
その他(Microsoft Office)
-
18
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PLSQLのNumber型の初期化
-
数値をNUMBER型にするかCHAR型...
-
sqlで質問です。 idを元にidに...
-
SQLについて教えて下さい。 主...
-
ROWNUMでUPDATEをしたいのです...
-
SQL、2つのテーブルで条件一致...
-
distinct をexistsに変換する
-
複雑な抽出条件のSQL文
-
次のデータを抽出する効率のよ...
-
特定のカラムが更新されたとき...
-
テーブルやカラムの物理名のネ...
-
INSERT文のSELECT部分の更新
-
sqlで質問です。 Aテーブルの情...
-
sqlplusで表示が変なので、出力...
-
Oracle(オラクル)で、日付時刻...
-
日付の古い順番に削除したいの...
-
SQL update方法
-
住所のDBテーブル、マスターの...
-
Notion@リレーション値の取得...
-
QSL でのフォーム画面作成について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブル名をカラムとして取得...
-
SQL、2つのテーブルで条件一致...
-
update文で改行を入れる
-
ROWNUMでUPDATEをしたいのです...
-
sqlplusで表示が変なので、出力...
-
SQL 複数テーブルのupdate
-
SQL*LoaderでCSVから指定した列...
-
SQLでSUMなどの関数でデータが...
-
SQLで違うテーブルの値を比較し...
-
カラム位置変更
-
UPDATE文
-
件数とデータを同時に取得する...
-
特定のカラムが更新されたとき...
-
Oracle(オラクル)で、日付時刻...
-
半角英数文字の抽出がしたい。
-
数値をNUMBER型にするかCHAR型...
-
DELETE文とロックについて
-
Oracleのview、synonymをCOMPIL...
-
SQL(oracle)でご助言いただきた...
-
SELECT文で指定桁数分抽出する...
おすすめ情報