• ベストアンサー

ORACLEでNCHAR/CHARの違い

ORACLEでNCHAR/CHARの違いについて教えて下さい。 文字列の記述に以下の2つの書きかたがありますが、 1.NCHAR(40) 2.CHAR(40 CHAR) これらにはどのような違いがあり、どう使い分けると良いでしょうか? よろしくお願い致します。 以上

  • Oracle
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
回答No.2

文字コードには古い歴史がありますので、まだ過渡期ですが、最終的にはUNICODE(プログラム内部では16ビットの純正のUNICODE、インターネット等はUNICODEを1バイト変換したUTF-8)に集約されて行くと考えて下さい。 シフトJISの場合は日本語しか対応できませんが、UNICODEであれば世界中の文字を混在させる事ができます。OracleはNCHARも1バイト単位で記憶しているようですが、SQL Server等のNCHARは2バイト(16ビット)のUNICODEで記憶しているようです、他のデータベースはUTF-8を使用している物もありますが、こちらは、日本語がほぼ3バイトで表現されるので、DB2等は文字数に影響します。尚、PostgreSQL等はUNICODE変換時の文字数で計算してUTF-8で登録出来るようです。(NCHARが無いRDBMSも有ります) どちらにしても、8ビットのACSIIコードのみ登録する場合はCHARで、以外はNCHARとされると良いです。

yu_OKWave
質問者

お礼

ご丁寧に有難う御座いました。

その他の回答 (1)

回答No.1

NCHARはNational Caracterですので本来は各国別コードを登録する事を想定しています。 一方、CHARは本来はASCIIコードのみを想定しています。 Oracleの場合、どちらでも各国別コードを登録できますので、厳密に区分けしなくても動きますが、一応、日本語を含む場合はNCHAR,含まない場合はCHARとされると良いと考えます。

yu_OKWave
質問者

お礼

早速の回答有難う御座いました。 ひとつ質問させて頂きたいのですが、 >>一応、日本語を含む場合はNCHAR,含まない場合はCHARとされると良い についてですが ・・・ この「日本語」という意味は「全角文字」と考えて良いでしょうか? たとえば、ベトナム語やタイ語でも同様でしょうか? また、日本語とベトナム語やタイ語が混在する場合は如何(NCHARを選択すべきと考える)でしょうか? よろしくお願い致します。

関連するQ&A

  • Oracleのnchar型について

    お世話になります。教えてください。 Oracle9iのnchar型について詳しく知りたいのですが。 char型の場合、データベースの作成時の文字コードで文字が格納 されますが、nchar型の場合、unicodeで格納されるという 認識でいます。 例えば、SJISには存在しない文字は、char型の列に登録すると、 文字化けするので、 nchar型の列に登録しようと思うのですが、nchar型の列の値を SQLPlusやosqledit,objectbrowserで表示しても '?' と 表示されます。 正しく nchar型の列の値を表示する にはどうすればいいのでしょうか? 例えば、VB.netなどのプログラムから取得した場合には、正しく 文字化けせずに取得できるという認識でいいのでしょうか?  よろしくお願いします。

  • char*型の文字列をchar[10]へ。

    char*型の文字列をchar[0]から順番に格納したいのですが、 どうやってやるかご存知の方おられますでしょうか。 申し訳ございません、宜しくお願い致します。

  • CHAR型ポインタについて。

    CHAR型ポインタについて。 当方C言語初心者です。 ポインタと文字列の関係分からないことが出てきました。 参考にしている本があり、そのページに下記のソースで「const char *pc1」のポインタ変数を用意して、そこに直接文字列を代入しています。 本来、「char *pc1」はchar型のアドレスを格納するための変数のはずなのに、その変数に文字列を代入してることに疑問を感じました。 この記述の仕方は間違っていないのでしょうか?また、アドレスを格納するための変数「*pc1」に「abcdefg」の文字列はどのようにメモリ上で格納されているのでしょうか? 知ってどうなるの?みたいな質問かもしれませんが、ご教授いただけると幸いです。 #include <stdlib.h> #include <string.h> void func(void) { const char *pc1 = "abcdefg"; //←ココ char *pc2 = (char *)malloc( strlen(pc1) +1); if ( pc2 ) { strcpy( pc2, pc1 ); free( pc2 ); } }

  • ORACLEでLONG項目からCHAR項目へ桁数指定で文字列を抽出

    ORACLEでLONG項目からCHAR項目へ桁数指定で文字列を抽出したいのですが、方法はありますか? LONG項目の先頭から30桁分の文字を抽出し、CHAR項目に入力したいのですが。 会社で使用しているERPパッケージでLONG項目があり、どうしてもこの項目から文字が抽出したいのです。 回答のほど宜しくお願いします。

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

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

  • char型について【初心者です】

    プログラミング初心者です。 char型について質問です。 一般的にchar型とは文字列の定義という風に教えてもらったことがあるのですが、言語やデータベースによってchar型の定義は違うものなのでしょうか? 例えば、javaでは   char a = 'あ' というように、文字が全角一文字しか定義できないのに対して、SQLでテーブルを定義するときでは「長さ:10」というように文字を一文字以上格納できるので、大変疑問です。(この考え方が間違っているのでしょうか?) SQLの「長さ」というのも具体的に何の長さなのか分かりません。 かなりの初心者と思われるでしょうが分かりやすい回答を頂きたく思います。 よろしくお願いします。

  • charってなんですか??

    http://www.nttdocomo.co.jp/service/imode/make/content/html/about/input.html 上記のドコモのサイトの中で、下のように【accesskey="char"】という記述があります。 この【char】というのはなんなのでしょうか??(読み方含め) うまいググり方も分からず質問させていただきました。 ------------------------------------ 【書式1】テキスト入力 <INPUT type="text" name="フィールド名" value="データ" size="文字数" maxlength="最大文字数" accesskey="char" > ------------------------------------- 分かる方、お願い致します!

    • ベストアンサー
    • HTML
  • char *name1[4] とchar name2[][4] の違いについて

    C言語のことで質問があります。 char *name1[4]は char *name1[4] = {"abcdefghi","jkl","l","mn"}; と宣言でき,ポインタを4つ確保した形となりました。 char name2[][4]は char name2[][4] = {"abc","def","ghi","jkl","mno","pqr","stu","vwx"}; と4文字以内の文字列を初期化した数だけ確保した形となりました。 この結果からchar *name1[4]の意味は,char name2[][4]ではなくchar name2[4][]に近いと思いました。 しかし,char name2[4][]ではポインタを4つ確保した事にはならないみたいでコンパイルが通りません。 *name1[4]では4つのポインタを確保できるのに~と思ってしまいます。 ポインタと配列は別物と考えるべきなのでしょうか? 訳の分からない質問かもしれませんが, 何卒ご指導いただくようよろしくお願いします。

  • Date型からChar型への変換

    SQLServer初心者です。 OracleではDate型をChar型にして抜き出したい場合、 関数ToCharを使っていますが、SQLServerにはこの関数がないようですが、どの関数がこれにあたるのでしょうか? また、やりたいことはGetDateにより取得したシステム日付を、Char型の'yyyy/mm/dd'として出力したいのですがどのように記述したらよいのでしょうか。

  • System::String->char*変換でき

    C++/CLIでSystem::String^文字列をchar*に変換する関数を書いたのですが、256文字以上の文字列を投げて、戻値を確認してみると、255文字分しか中身が詰まっていません。元の文字列はアスキーのみです。 #include <msclr/marshal.h> using namespace msclr::interop; static char* toPtChar(const String^ Text) { String^ temp = (String^)Text; msclr::interop::marshal_context^ context = gcnew msclr::interop::marshal_context(); char* res = ((char*)(context->marshal_as<const char*>(temp))); return res; } この関数をどのように変更すれば、256文字以上変換できるでしょうか?