• ベストアンサー

SQL文のLengthについて

CREATE TABLE MM(NAME CHAR(10)); で作ったテーブルがあります。 インサート文('株式会社'); とデータを入力し、 SELECT NAME , LENGTH(NAME) FROM MM; とセレクトすると LENGTH(NAME)=6 とでます。 また インサート文('漢字漢字漢'); と入力し、 SELECT NAME , LENGTH(NAME) FROM MM; とセレクトすると LENGTH(NAME)=5 とでます。 なぜだか理解できません。 宜しくお願いします。

  • fm0606
  • お礼率13% (100/761)

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

  • ベストアンサー
  • Mizyu
  • ベストアンサー率41% (245/593)
回答No.1

Oracleですね。 LENGTH関数は「文字数」を返すものです。 で、Char型は固定長なので、Char(10)と宣言をすると 10バイトの容量を確保し、不足分は半角スペースで埋めます。 なので、「株式会社」は内部では 株式会社 + 半角スペース 2つ なので、4文字+2文字で6文字 「漢字漢字漢」は10バイトぎりぎりまで使っているので5文字であると返却されます。 Varchar2型で宣言すれば、実際の文字数通り返却されます。 あと、バイト数を返却したいのであればLENGTHB関数を使えばよいです。 その場合、両方10が返却されます。

fm0606
質問者

お礼

たいへんわかりやすい説明文でした。 ありがとうございました。

関連するQ&A

  • SELECT文の二段重ね

    次のSQL文を実行します。 create table1 (id, english) insert table1 (1,"foo") insert table1 (2,"bar") create table2 (id, japanese) insert table2 (1, "ふー") insert table2 (2, "ばー") SQL文法としては誤ってますが、成功したとします。 いま、select id from table1 where english = 'foo'; で1が得られます。 いま、select japanese from table2 where id = 1; で"ふー"が得られます。 これを一つのSQLite3のselect文で実現できないでしょうか。 select japanese from table2 where id = (select id from table1 where english = 'foo'); で良いですか? カテゴリ選択にSQLiteが無いのは、人気が無いからですかね。

  • 見たことのないINSERT文

    お世話になります。 他人の書いたSQLを解析して以下のようなコードを見つけました。 CREATE TABLE OYA ( ID NUMBER NOT NULL, NAME VARCHAR2(10) ) / CREATE TABLE KO ( ID NUMBER NOT NULL, OYA_ID NUMBER NOT NULL, NAME VARCHAR2(10) ) / INSERT INTO ( SELECT ID ,OYA_ID ,NAME FROM KO WHERE EXISTS ( SELECT ID FROM OYA WHERE NAME LIKE '%1' ) ) VALUES ( 1 ,1 ,'KODOMO-1' ); INSERT文でテーブル名を指定するかわりにSELECT文を指定しています。 SELECT INSERT文は知っていますが、このような表記は初めてです。 (文法エラーにならないのに驚きました) おそらく意図するところは、ある条件に一致したOYAが存在する場合に、KOをインサートするのだと思いました。 実際は、OYAがなくてもINSERTは実行されてしまいますが。。。 このような表記のINSERT文の説明が書いてあるサイトをご存知の方がいらっしゃいましたら、よろしくお願いします。

  • update文の副問い合わせ使用

    2つのテーブルを結合して、片方のテーブルをUpdateしたいが、Update文での結合方法がよくわかりません。 table_a の excode列が更新対象で、table_aのname列とtable_bのname列の等価結合です。 テーブルとデータの例は以下です。 テーブル1:table_a create table table_a (code int(3), name varchar(10), excode int(6)); insert into table_a values (101,'あいう',0),(102,'かきく',0),(103,'たちつ',0),(201,'なにぬ',0),(301,'わをん',0); テーブル2:table_b create table table_b (excode int(6), name varchar(10)); insert into table_b values (500101,'あいう'),(500102,'かきく'),(500103,'たちつ'); 期待する結果は以下です。 SQL> select * from table_a; +------+--------+--------+ | code | name | excode | +------+--------+--------+ | 101 | あいう | 500101 | | 102 | かきく | 500102 | | 103 | たちつ | 500103 | +------+--------+--------+ MySQLバージョンは、5.0です。 よろしくお願いいたします。

  • 下記のSQL文の結果をPHPページに表示したい

    質問、失礼いたします。 下記のSQL文の結果を、結果が0の場合を除き、 PHPページで表示させたいのですが、PHPテーブルの作り方がわからりません。 【$sql】 SELECT char_length(`address`)-char_length(replace(`address`,'東京','')) FROM table1 ORDER BY CHAR_LENGTH( `address` ) - CHAR_LENGTH( REPLACE( `address` , '東京', '' ) ) DESC LIMIT 0,10 $result = executeQuery($sql); $res = mysql_fetch_assoc($result); while($row = mysql_fetch_array($res)){ $table = "<table><tr><td>".row[char_length(`address`)-char_length(replace(`address`,'東京',''))]."</td></tr></table>"; } echo $table; 自分なりに上記の方法を試したのですが、違ったようで解決策がどうもみつかりません。 ご存じの方いらっしゃいましたら、なにとぞご教授お願い致します。

    • ベストアンサー
    • PHP
  • AccessのテーブルをSQL文にしたい

    urizakaです。 さて、今回質問したいのは、Accessで作ったテーブルをSQL文にする方法です。 具体的には、ACCESSで作ったテーブルを、 CREATE TABLE ××× (              ) INSERT… というSQL文にしたいのですが、これはどうすれば良いのでしょうか? すみませんが、教えてください。            

  • SQLについてアドバイスください。

    USER_TAB_COLUMNSから入力したテーブル名で構造を抽出し SQL文を作成出来るものを作ろうとしています。 80%までうまく行くのですが、SELECT文でフィールドをカンマ付けで置いていく 所で最後のフィールドに来た時カンマが付加されてしまいます。 これを最後のフィールドに来た時カンマが付加されないでスペースで置くように したいのですが。。 set pagesize 0 set linesize 1000 set trimspool on set feedback off set verify off ACCEPT TABLE CHAR PROMPT 'TABLE NAME:' set termout off spool C:\TEST_csv.sql SELECT 'SELECT ' FROM DUAL; SELECT COLUMN_NAME || ',' FROM USER_TAB_COLUMNS WHERE TABLE_NAME = UPPER( '&TABLE' ) ORDER BY COLUMN_ID; SELECT 'FROM DUAL' FROM DUAL; SPOOL OFF

  • oracle10g(10.2.0.1.0)のsql*plusでの出力について

    質問させていただきます。 sql*plusを使用して以下のような簡単なテーブルを作成しました。  create table XXX_TBL ( NUM NUMBER(3), NAME CHAR(5)); データをINSERT後、SELECT * FROM XXX_TBLで内容を表示したところ、 以下のように表示されました。  NUM              NAME  ---------- ---------------                1  test NAMEはCHAR(5)で作成したにもかかわらず、---の 数が15もあります。 oracle9iでは、CHAR(5)の場合の---の数は5でした。 上記例では、2項目しかないためsql*plusで出力しても 気になりませんが、項目数を増やし、またカラムサイズを 大きくした場合に、見づらくなってしまいます。 何らかのパラメータの設定を変更すればよいのかと思い、 いろいろと調べて見ましたがわかりませんでした。 ご教授願います。

  • SQL シーケンスについて

    Orcle8iを使用しています。 INSERT INTO SELECT で別のテーブルのデータを追加したいのですが、そのうち1つフィールドには、シーケンスオブジェクトで取得した値を入れたいと思っていますが、INSERT文が作れません・・・。 例えば ----------------------------- INSERT INTO TABLE1(FIELD1,FIELD2,FIELD3)   SELECT --SELECT SEQ.NEXTVAL FROM DUAL??--     FIELD1_2,     FIELD1_3 FROM TABLE2 WHERE FILED1_2='X'; ----------------------------- という場合、TABLE1のFIELD1に連番を入れたいのですが 書き方が分かりません。 http://www.okweb.ne.jp/kotaeru.php3?q=347146 上記URLの質問に、シーケンスのSELECT文を副問い合わせにして・・・という回答があったのですが、それもよく理解できませんでした・・・(T_T) シーケンスのSELECT文をどう埋め込めば良いのでしょうか? どなかた教えていただけませんか? よろしくお願いします。

  • My SQL の concat文について

    あるテーブルtable01にname列があったとします。 その列に ”様" をつけたいと思い、concat文を使おうと思い、 以下のようにしたのですが、 mysql> Select concat(name,"様") from table01; +-------------------+ | concat(name,"様") | +-------------------+ | ito様 | | sato様 | | aikawa様 | | abe様 | | yamada様 | +-------------------+ 5 rows in set (0.00 sec) 列名もconcat(name,"様")となってしまっていますが、 As nameを使う以外に nameとだけ表示させる方法はありますか?

    • ベストアンサー
    • MySQL
  • T-SQLとACCESSクエリのSELECT分内のif文の利用について

    お世話になります。 ACCESSクエリからSQLServer2005のストアドに移行を検討中です。 ACCESSクエリではINSERT INTO時のSELECT内にIIF文による条件分岐が使えたのですが、T-SQLでは、INSERT INTO時のSELECT内にIF文やswitch文は使えないのでしょうか?その場合、どのようにすれば宜しいでしょうか? 例> ACCESSクエリでは以下のようにかけると思うのですが・・・ INSERT INTO Table1 (Pコード,単価) SELECT Table2.Pコード,IIf(Table2.Check定価=1,Table2.定価A*Table3.値引率,Table2.定価B*Table3.値引率) FROM Table2 RIGHT JOIN Table3 ON Table2.Pコード = Table3.Pコード; 宜しくお願いします。