• ベストアンサー

LENGTH関数

こんばんわ! オラクルマスターシルバーに向けて勉強中です! 以前も質問しました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=481071 さて、また翔泳社のオルクルマスター教科書Silverの中の記述について質問があります。 LENGTH関数の使い方について、 LENGTH(NAME) NAME='オラクルマスター'の時、NAMEがVARCHAR2(20)の時は、結果は8、CAHR(20)の時は結果は12とあります。 CHAR型は、指定したバイト吸うに満たない場合は1バイトの空白文字を埋める、とあるので、8文字+1バイトで答えは9じゃないんですか? 正しい答えは8+4=12となってますが、なんで4なんでしょう?? この4はどこから出てきたのでしょう? どなたか教えてください!よろしくお願いします!

  • piyora
  • お礼率99% (471/472)

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

  • ベストアンサー
  • proust
  • ベストアンサー率57% (62/108)
回答No.1

#以下、うろ覚えで書いたので、しかるべき資料で #ウラはとってください。 まず、データベースを作成するときの文字コードにより、 varchar(n)に何文字の日本語が入るかが決まります。 EUCとかだと、日本語1文字あたり2バイト消費するので 「オラクルマスター」は16バイトを消費することになり、 20バイトには残り4バイト足りないことになります。 次に、char(n)は、指定したバイト数に満たない場合には、 「指定したバイト数に足りない部分を全て」1バイトの 空白で埋めます。 従って、 char(20)に 「オラクルマスター」を入れると、後ろに 4バイトの空白が入ることになります。 これを lengthBと後ろにBのついた関数を使えば、 実際のバイト数(=20)が取れますが、 lengthだと日本語1文字は1と数えるので 日本語8文字+空白4文字で12(文字)という解になります。

piyora
質問者

お礼

さっそくの回答ありがとうございます! なるほど、4というのは20-16=4だったんですね☆ で、8文字+4バイト=12文字・・・ なんか、文字数とバイト数を足しちゃってるところが気持ち悪いのですが、 この4バイトは、4文字と考えていいんですよね。 これで今日はすっきり眠れます。 わかりやすく説明してくれてありがとうございました!

その他の回答 (1)

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 > なんか、文字数とバイト数を足しちゃってるところが気持ち悪いのですが LENGTHB を使用すると、文字数ではなくバイト数で結果を返してくれます。 関数の詳細については、「SQL リファレンス」に記載されています。

piyora
質問者

お礼

こんばんわ!回答ありがとうございます☆ そうそう、バイト数を返すのはLENGTHBですよね。 昨日勉強したところです☆ 質問は、「文字数なのに、バイト数と足すことが気持ち悪い」という意味だったのです。 まぎらわしくてごめんなさい! そして今日もまた教科書で納得できないことが・・・ もしよろしかったらそちらも覗いてみてください! どうもありがとうございました☆

関連するQ&A

  • INSTR

    こんにちわ。 なぜかオラクルシルバーという資格を取らなければいけないことになりました。 私パソコンなんて全然わからないのに・・。 今、翔泳社から出ている「オラクルマスター教科書 Silver」という本で勉強中ですが、わからない事がありますので教えていただけたら嬉しいです! 文字列関数のINSTRについてなんですが、教科書に例として INSTR('SYSTEMTECHNOLOGY-I','E',8,1) ----------------------------------- 9 と載っています。 INSTRの定義は、INSTR(char1,char2,n,m)で、 char1のn番目の文字からchar2の探索を開始し、char2がm番目に現れる位置を戻す、とあります。 なので、この例題の場合は、 'SYSTEMTECHNOLOGY-I'の8版目の文字列→E から E の探索を開始し、 E が 1 番目に現れる位置を戻すのですから、 答えは0だと思うのですが・・・・・・・ 私の考え方はどこが間違っているのでしょうか。 数学は苦手なんです~~~ 宜しくお願いします!!

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

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

  • lengthで返ってくるバイト数の計算があいません

    お世話になります。 lengthで返ってくるバイト数の計算があわず困っています。 全角文字列と全角スペースをあわせて12文字(24バイト)の出力をさせたくて以下のように記述しました。 $spaceStr = ' ' x ((24 - length($in{'name'}))/2); $in{'name'}には全角の名前が入るようにしています。 最終的に$spaceStrをテキストに出力したいのですが、 例えば$in{'name'}が「あ」の一文字の場合、期待では ' ' x ((24 - 2)/2) なので11文字の全角スペースが出力されると思ったのですが、出力は9文字の18バイト分の全角スペースしか出力されません。 この原因は何でしょうか? ご教授の方をよろしくお願いします。

    • ベストアンサー
    • Perl
  • オラクルマスターの試験について、教えてください。

    現在、仕事でオラクルを使用している(表現間違ってるかもしれません^^;;)のですが、 これを機会に資格を取得しようと思い、「オラクルマスター」の「Silver」を受験しようと思っています。 もし、この資格をお持ちの方、または詳しい方がいらっしゃいましたら、 勉強方法、受験方法などアドバイスをご教授願えませんでしょうか? 過去ログで、受験料が高い(一回三万円?^^;;)ことは分かったのですが・・・。 また、この資格を得て、得する事などありましたらお教えください。 よろしくお願いします。 ちなみに、翔泳社の改訂版オラクルマスター教科書Silverを購入して、 今は勉強しております。

  • オラクルマスター(シルバー)のオンライン模擬試験

    こんにちわ! まったくオラクルを触ったことが無いまま机上の勉強だけでオラクルシルバーを受けようとしています! 一応翔泳社のオラクルマスター教科書っていうのをひととおり勉強し終わったのですが、まだまだ不安です。 そこでオンラインで模擬試験みたいのをできるサイトがあったら教えてほしいのです。 自分で探したんですが、ふたつくらいしか見つけられませんでした。 最後の追い込みです。 よろしくお願いいたします☆

  • オラクルマスターさんに質問です。

    来週オラクルマスターシルバーDBAIを受けようと思うのですが、 どんな感じの問題が出るのでしょうか?依然受けたオラクルSQL の試験のとき、市販の問題集とあまりに雰囲気が違うのに戸惑い 落ちた苦い経験があります。。。今、翔泳社の問題集をといているのですが、実際の試験はどうなのでしょうか???

  • オラクルの勉強

    これから、翔泳社オラクルマスター教科書Silverで、勉強しようと思っています。 (購入予定です。) で、最新は[9ⅰ]ですが、[8ⅰ]の教本から勉強した方がいいのでしょうか? また、[9ⅰ]の教本で、勉強しても[8ⅰ]をこなせるのだろうか? いやいや、[8ⅰ]から勉強した方が、[9ⅰ]より楽なのか? 実際、本屋では[8ⅰ]の教科書は、未だ置いてあるのか?取り寄せか? 何がなんだか、どうした物か・・・ 超初心者ですが、アドバイスを頂ければ幸いです。m(..)m

  • 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の列の数や並び方が異なっていることがあります。よろしくお願いします。

  • Oracleシルバーの問題です。

    翔泳社オラクルマスター教科書Silverを使ってシルバー取得の勉強をしています。 その中でわからない点があったので教えてください。 1.CONSTRAINT EMP_FK1 FOREIGN KEY(MGR) REFERENCES EMP(EMPNO) 2.CONSTRAINT EMP_FK2 REFERENCES DEPT(DEPTNO) というふたつの制約文で、1.が正解で2が不正解となっているのですが、逆じゃないかな?と思うんです。 だって制約文の構文は 列名 データ型 ,[CONSTRAINT 制約名] 制約 ,[CONSTRAINT 制約名] 制約... とあります。 1.は","で区切ってないから間違いだと思うんですがどうでしょうか? どなたか解説していただけないでしょうか。 宜しくお願いいたします☆

  • データの取得方法

    Aテーブル{ id char(3) not null, name varchar(10), a_no char(5), b_no char(5), c_no char(5), date timestamp } Bマスタ{ no char(5), name char(10) } 上記のようなDBがあるのですがAテーブルのa_no、b_no、c_noに入るのはBマスタのnoになります。 下記のようにデータを取得したい場合、どうすればうまく取得できるのでしょうか。 A.id, A.name, A.a_no, カラム名をname1としてB.name, b_no, カラム名をname2としてB.name, c_no, カラム名をname3としてB.name そんなに難しいことではないと思うのですが、考えれば考えるだけ頭の中でこんがらがってきて困っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL