
テーブルのカラムで、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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL 複数テーブルのupdate
-
SQL、2つのテーブルで条件一致...
-
テーブル名をカラムとして取得...
-
update文で改行を入れる
-
SQLでSUMなどの関数でデータが...
-
SQL*LoaderでCSVから指定した列...
-
sqlplusで表示が変なので、出力...
-
OracleのSQLで同テーブルのカラ...
-
マテリアライズド・ビューの変更
-
特定のカラムが更新されたとき...
-
ROWNUMでUPDATEをしたいのです...
-
性能問題について
-
SELECT文で指定桁数分抽出する...
-
LONG型の先頭250バイトを Varch...
-
日付の古い順番に削除したいの...
-
DBからタブ区切りのCSVデータを...
-
SQLで違うテーブルの値を比較し...
-
数値をNUMBER型にするかCHAR型...
-
PLSQLのNumber型の初期化
-
カラム位置変更
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQL、2つのテーブルで条件一致...
-
SQL*LoaderでCSVから指定した列...
-
sqlplusで表示が変なので、出力...
-
update文で改行を入れる
-
SQL 複数テーブルのupdate
-
テーブル名をカラムとして取得...
-
SQLでSUMなどの関数でデータが...
-
ROWNUMでUPDATEをしたいのです...
-
カラム位置変更
-
SQLで違うテーブルの値を比較し...
-
SQL(oracle)でご助言いただきた...
-
特定のカラムが更新されたとき...
-
Oracleのview、synonymをCOMPIL...
-
テーブルやカラムの物理名のネ...
-
DBからタブ区切りのCSVデータを...
-
数値をNUMBER型にするかCHAR型...
-
LONG型の先頭250バイトを Varch...
-
OracleのSQLで同テーブルのカラ...
-
Viewのカラムの長さが不明?
-
件数とデータを同時に取得する...
おすすめ情報