• ベストアンサー

オラクルのデータ型について

オラクルのデータ型について教えてください。 ものすごく基本的な質問かもしれませんが、今後のことを考えて質問させていただきます。 文字列の型の"CHAR"と"VARCHAR2"についてです。 "CHAR"は固定長で2000バイト、 "VARCHAR2"は可変長で4000バイトとマニュアル等には記載されていますが、 いまいちピンときません。 そこで、それぞれの長所、短所。どのような時にどちらを使用したらいいのか 等をなるべく詳しく教えてもらえないでしょうか? 宜しくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ST202
  • ベストアンサー率100% (1/1)
回答No.2

データ型の詳細が載っているホームページのことではないのですが、参考までに。 固定長、可変長以外にも、比較した時の比較のされ方も異なってきます。 CHAR型はスペース埋め込み比較、VARCHAR2は非スペース埋め込み比較を行います。 具体的にいうと、MOJI CHAR(5)と宣言した列に'ABC 'を入れたとします。 CHAR型の場合、SQLのWHERE句でMOJI='ABC'と比較した場合、スペース埋め込み比較をしますので一致しますが、VARCHAR2型は、非スペース埋め込み比較を行うのでMOJI='ABC 'の様に列に入力した通りに比較しなければ該当しないはずです。 最近ORACLEから遠ざかっているもので^^; CHAR型は、「今後のバージョンではサポートされない可能性があるので、使用することを推奨ません」と、かなり昔からマニュアルに記述していますので、新規に作成するテーブルでしたら、CHAR型の使用は避けたほうが良いと思います。

tomoyui
質問者

お礼

やはり"char"は避けた方がいいのですね。 これから"VARCHAR2"を使うようにしたいと思います。 ありがとうございました

その他の回答 (1)

  • arara0123
  • ベストアンサー率47% (8/17)
回答No.1

【CHAR】固定長 サイズ(長さ)が一定で、入力した値がその長さに足りない場合は、 スペースで不足分が補われます。 あらかじめ、入力される文字列の長さが決まっている場合はこちらを使用します。 (その一定の長さで定義します。) 例)社員コードなど 【VARCHAR2】 可変長 サイズ(長さ)が決まっていない(一定でない)情報に使用します。 この場合は、CHARと違って入力された文字列の長さが 定義した長さより短いデータであっても空白が補われないため、 資源(ディスク)の有効利用ができるメリットがあげられます。 (入力したいデータの最大長maxsizeで定義します。) 例)住所など 概要ではありますがご参考に

tomoyui
質問者

補足

ありがとうございます。 "CHAR","VARCHAR2"についてはわかりました。 ところで、Oracleのデータ型が表のような形で掲示してあるホームページって ないですか?(詳しくデータ型について説明してあるHP)出来れば教えてください。宜しくお願いします。

関連するQ&A

  • mysqlの型について質問です。

    mysqlの型について質問です。 mysqlでvarchar(1) nullという使い方はどのような時に使用するのでしょうか? 可変長文字列で1文字でnullが有効と言うことは char(1) nullで良かったりするのでしょうか?

    • ベストアンサー
    • MySQL
  • AccessからOracleへのリンクテーブル時の型情報?

    Access始めたばかりの初心者です。 現在Oracle10gのデータベースのとあるテーブルを をAccess2000でリンクし、クエリで抽出したものをレポートに表示 しようとしています。 そのテーブル上に、 Oracle上ではVARCHAR2(6バイト)の日付データがあります。 例) 200806 これをAccessのクエリ上で変換し、 "6月" と表示させたいのですが、 なぜかうまくいきません。 Oracle上の項目名が YM だとすると、 Replace(Right([YM], 2), "0", "") & "月" こういった関数でうまくいきそうなものですが・・ もしかしてOracleのVARCHAR2はリンクすると文字列型以外の型として 扱われるのでしょうか・・ どなたかご存じの方、ご教授くださいませ。

  • charのデータ型について

    普段Oracleを利用しています。 Oracleだとvarchar2のカラムを作成する際に、 バイトか文字(キャラクタ)の指定ができるのですが、 Postgresでは指定できないのでしょうか。 どちらか固定ですか? 指定できるのでしたら既にあるテーブルのカラムが どちらになっているかわかる方法はないでしょうか。

  • MySQLの文字列型について

    お世話になります。 win7 SP1 / エクセル2013  プロセッサ IntelCore Duo CPU 1.2GHz メモリ 1GB の環境です。 ローカルPCで MySQLからエクセルにVBAを使ってSELECT構文にて 書き出ししようとしていますが、 MySQL側で文字列型を TEXT にて保存しているカラム(列)が 1行分しかエクセル側に移せません。 MySQLのデータをVARCHAR(510)型に変更した上で データを保存しなおして 同じSELECT構文にて実行すると 問題なく抽出できます。 TEXT型は可変長型なので 問題ないかと思っていたのですが SIZE(65535バイト)は関係しますでしょうか? 詳しくないのですが TEXT型は可変長バイナリーデータ VARCHAR型は可変長文字列型 と認識してますが、 同じ可変長型でも、データ取り出し時に 何か違いが生じるのでしょうか? 原因がよくわかりません。 また、そうであるとすると このような作業を行う場合は TEXT型の利用はあまりしない方が良いということでしょうか? 特に長いURLなどを保存するときは 文字数を推測し難いので TEXT型の方が便利かと思っています。 どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL
  • Oracle SQLにて固定長でデータをselectする方法

    Oracle SQL超初心者の者です。 Oracle SQLで固定長を指定してデータをselectすることを考えているのですが、僕がやりたいことが見当たらず質問に至りました。 例えば、Field1はchar型で(10)で定義されているとします。このField1を固定長の(20)でselectしたいのです。 (空き領域は半角0を入力) また、Field1には「ヤマダ タロウ」や「ヤマノウチ ケンジロウ」のように、固定長のデータが格納されていません。 このようなことがOracle SQLで実現可能であれば是非とも教えていただきたいです。

  • Pro*CでVARCHAR2項目の検索

    こんにちは。たぶんとても基礎的なことと思うのですが。。。 Pro*CでSELECTするとき、WHERE句の中でVARCHAR2項目を条件に入れています。 が、どうも検索がうまくできなくて質問しました。 ホスト変数の定義…  char VVV[5]; 検索するところ… select xxx into :yyy from ZZZ where ZZZ.varchar2no4BYTE = :VVV ; のような感じです。ZZZ.varchar2no4BYTEの型はVARCHAR2(4)です。 で、ZZZ.varchar2no4BYTE が"1234"と"12"の2つのレコードを 登録しておいて、VVVに"1234"を入れると、ちゃんと検索できました。 んが、VVVに"12"を入れても検索されません。 そんなのあり?と VVVに"12 "を入れてもだめ、 VVVをVARCHAR構造体?にして、"12"で長さ2にしてもだめ、 だけどZZZ.varchar2no4BYTEがCHAR(4)だと"12"でOK、 なんなんだとPro*Cのマニュアル見てもNUMBER型の検索例ばかり、 というところで力尽きました。 (あー、CHAR_MAP=STRING って関係あるですかね) 動的SQLにすればよいのかもしれませんが、事情で使えないのです。 それ以前にホスト変数の理解が間違っているのではないかと思い、 お聞きするしだいです。

  • Varcharについて

    Oracleでは文字列の宣言にVarchar2()を使いますよね 何故、OracleだけVarcharではなくVarchar2なのですか? ※OKWAVEより補足:「Webシステム開発」についての質問です。

  • ORACLE VARRAY型へCSVからインポート

    皆さまの知恵をお借りしたくご質問させて頂きます。 ORACLEのテーブルにVARRAY型を含むフィールドに SQLLOADERを使用してCSVからインポートを行っているところですが どうもインポートができません。 (「データ・ファイルのデータ型が正しくありません」と表示) VARRAYのタイプは、下記の様に設定していると思います。 TEST_VARRAY as VARRAY(100) of Varchar2(100) (TYPEのソースより) テキストファイルは、カンマ区切りのダブルクォーテーションで囲っております。 さらにVARRY内の区切りは、「','」を使用していると考えられます。 テキストファイル例) "NO","FIELD1_VARRAY" "001","TEST_VARRAY('00000.....','11111.....)" ※一度、テキストファイルに出力した内容となります。  訳があり別ORACLEにインポートしなくてはいけない状態になりました  (dmpは、ORACLE11gから9iに移行する為、使用できないと思います) 今は、試行錯誤しながら下記のコマンドを実行しております。 (NO, FIELD1_VARRAY VARRAY TERMINATED BY ’,’ ( FIELD1_VARRAY COLUMN OBJECT ( VARRAY CHAR(200) ) ) ) まだまだORACLEを始めたばかりで 型とかも全然分かっておりませんが 皆さまの知恵をお借りしたくご質問させて頂きました。 お忙しいところ恐れ入りますが よろしくお願い申し上げます。

  • csvファイルの読み込みとOracleDBへの更新

    VB6.0とOracle9i、どちらも初心者です。 C:\直下にあるtest.csvファイルを読み込み、Oracleのテーブルと比較して存在しないものはinsert、存在するものはupdateする。 ・test.csvファイル(百行) "LOCATE", "COMPANY_CODE", "COMPANY_NAME", "COMPANY_KANA", "ZIPCODE", "ADDRESS", "TEL_NO", "FAX_NO", "CATEGORY", "INDUSTRIES", "PERSONS" ・OracleのCustomerテーブル COMPANY_CODE NUMBER COMPANY_NAME VARCHAR2 COMPANY_KANA VARCHAR2 ZIPCODE CHAR ADDRESS VARCHAR2 TEL_NO CHAR TEL_NO_2 CHAR FAX_NO CHAR HP_URL VARCHAR2 NOTE VARCHAR2 CUST_VARCHAR_1 VARCHAR2 CUST_VARCHAR_2 VARCHAR2 CUST_VARCHAR_3 VARCHAR2 CUST_VARCHAR_4 VARCHAR2 ・ロジック 1.oo4oでOracleに接続 2.csvファイルの読み込み 3.oracleのレコードとの比較 4.insertプログラム 5.updateプログラム ・コード '** oo4o 接続 dbname = "****" cnuser = "****/****" Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.OpenDatabase(dbname, cnuser, ORADB_DEFAULT) Open "c:\test.csv" For Input As #1 ' csvファイルをオープンして、1行ずつループで取り込んで、取り込んだcsvレコード(行)を元にキー項目(COMPANY_CODE)を条件に既にOracleテーブルにあればInsertクエリを, なければUpdateクエリを発行する、をファイルエンドまで繰り返します。 自分でなんとか書いて聞くのが礼儀だと思いますが、調べてもやっぱりどう書けばよいのか全くわかりません。懸念事項として、Oracleのテーブルの列とCSVの列の数や並び方が異なっていることがあります。よろしくお願いします。

  • MySQL5.1の文字列サイズは文字数ではない?

    blue-horse と申します。 お世話になります。 MySQL 5.1 でVARCHAR、CHAR などの字列型フィールドのサイズ指定は、文字数であると認識していたのですが、違うのでしょうか。 utf8の日本語を保存しようとすると、3倍のサイズを要してしまいます。 これはutf8の漢字は3バイトであることと符合するので、なんとなく理解できるのですが、MySQL5.1のリファレンス記述と一致しない様に見えて、納得できません。(不便ですし) >CHAR と VARCHAR タイプには、格納したい最大文字数を表す長さが宣言されています。例えば、CHAR(30) は最大30文字まで持つ事ができます。 「MySQL :: MySQL 5.1 リファレンスマニュアル :: 10.4.1 CHAR と VARCHAR タイプ」 より http://dev.mysql.com/doc/refman/5.1/ja/char.html あるいは、どこか設定を誤っているのでしょうか。 ご教示頂ければ有り難く存じます。 以上、失礼いたします。

    • ベストアンサー
    • MySQL