テーブルのカラムで、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も見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
「マスタ」と「テーブル」の違いとはなんでしょうか?
Oracle
-
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
-
4
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
5
count(1)とcount(*)の違い
Oracle
-
6
単一グループのグループ関数ではありません。
Oracle
-
7
ウォッチ式の文字数制限について
Visual Basic(VBA)
-
8
データベース関係で、データの洗い替えとはどのような事を行うことでしょう
IT・エンジニアリング
-
9
Winmerge ファイルの中身は同じなのに黄色くなる
その他(OS)
-
10
Oracleのデータ型、NUMBERについて
その他(データベース)
-
11
tableタグとformタグの組み合わせ
HTML・CSS
-
12
Oracle 2つのDate型の値の差を「分」で取得したい
その他(データベース)
-
13
NUMBER(N,M) としたときの、格納データサイズ(バイト)
Oracle
-
14
CASE文のエラーについて
Oracle
-
15
MAX関数を使ってからLEFT JOINしたいのですが・・
PHP
-
16
SELECTで1件のみ取得するには?
Oracle
-
17
Excelで"で囲む方法
Excel(エクセル)
-
18
group byの並び順を変えるだけで結果が異なる
Oracle
-
19
【SQL】他テーブルに含まれる値に合致する行を抽出
その他(データベース)
-
20
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブル名をカラムとして取得...
-
update文で改行を入れる
-
SQLでSUMなどの関数でデータが...
-
SQL*LoaderでCSVから指定した列...
-
SQL 複数テーブルのupdate
-
SQL、2つのテーブルで条件一致...
-
ROWNUMでUPDATEをしたいのです...
-
Oracle(オラクル)で、日付時刻...
-
sqlplusで表示が変なので、出力...
-
SQLで違うテーブルの値を比較し...
-
sql(oracle)で質問です。 テ...
-
Oracleのview、synonymをCOMPIL...
-
OracleのSQLで同テーブルのカラ...
-
DELETE文とロックについて
-
改行コードの検出方法につきまして
-
特定のカラムが更新されたとき...
-
SQLの書き方を教えてください。
-
ワークテーブルって何?
-
oracle 複数列を1列にまとめる
-
件数とデータを同時に取得する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブル名をカラムとして取得...
-
SQL、2つのテーブルで条件一致...
-
ROWNUMでUPDATEをしたいのです...
-
SQL 複数テーブルのupdate
-
update文で改行を入れる
-
sqlplusで表示が変なので、出力...
-
SQL*LoaderでCSVから指定した列...
-
SQLでSUMなどの関数でデータが...
-
特定のカラムが更新されたとき...
-
SQLで違うテーブルの値を比較し...
-
件数とデータを同時に取得する...
-
カラム位置変更
-
UPDATE文
-
DELETE文とロックについて
-
数値をNUMBER型にするかCHAR型...
-
半角英数文字の抽出がしたい。
-
テーブルやカラムの物理名のネ...
-
DBからタブ区切りのCSVデータを...
-
Oracleのview、synonymをCOMPIL...
-
SELECT文で指定桁数分抽出する...
おすすめ情報