2012/12/06

文系のための「文字列型」(1)

コンピュータで扱う情報は「1」と「0」。そのようなデータをデジタルデータと呼ぶ。
デジタルデータには、様々な「」があって、その「」に応じた処理が行われる。
ここまでの話を整理すると、ざっと、こんな感じである。

さて、今回は、様々な「データ型」の中で、利用頻度が高い「文字列型」について。
おそらく、一般的なユーザが最も頻繁に用いている「」かもしれない。
もちろん、現在、書いているブログの文章も「文字列型」で構成されている。

まずは、「文字列型」とは何かについて考えてみる。

すでに、述べたように、コンピュータ上で扱う「文字」は、
たとえ数字であったとしても、何らかの「対応表」を参照していて、
その対応表の場所を「2進数」で示しているのであった。

こうして対応表を通して「2進数」で記述することを「符号化」と呼び、
符号化」された1文字を「文字型」、これを「配列」にしたものを「文字列型」と呼ぶ。
プログラミング言語の中には、「文字型」しか持たないものもある。

さて、今回は「文字列」の限界、すなわち、「文字数限界」について考えてみる。
実は、コンピュータで扱える「文字数」には限界がある。
もちろん、エクセルの一つのセルに入力できる文字数にも限界がある。

このことは、データベースを自分で構築する際の最も重要な知識の一つであり、
また、エクセルなどで比較的長い文字を扱う人は理解しておいた方が良い
特に、文献資料等の文字資料を扱う人は注意すべきで問題である。

では、早速、PostgreSQL9.1における「文字列型」を見てみる。
  1. character あるいは char
  2. character(n) あるいは char(n)
  3. character varying(n) あるいは varchar(n)
  4. text
実は、PostgreSQL 9.1 では、以上の4つの「文字列型」が存在している。

一つ目は、いわゆる「文字型」つまり、1文字だけ格納可能な型。
二つ目は「固定長文字列型」、三つ目は、「可変長文字列型」であり、
そして、四つ目は「テキスト型」と呼ばれている。

見方が解らない人が居るかもしれない。ということで、まずは、表示方法について。
括弧が付いている場合は、「()」の所までが「型名」で、
()」の中が「引数(パラメータ)」であり、この型の「限界値」である。

限界」というのは、この文字列の配列の数を表していて、
n」には、配列の長さをあらわす「1つの整数値」が入る。
つまり、「n」は、「文字数の限界を決めるための変数」である。

また、「可変長」と「固定長」というのは、この「文字数の限界」に関係していて、
可変長」の場合は、この「」に入っている文字列の長さが文字の数に依存し、
固定長」の場合は、この「」に入っている文字列の長さはその限界の数である。

要するに、「可変長型文字列」と「固定長文字列型」は文字数を決めないといけない
一方、「character」と「text」には、「()」が付いていないので、
この型については、引数が不要であることを示している。

例えば、「人名」を「10文字(20bite)」の「文字列型」で指定し、
この型に対応する値として「新島 襄」という値を入力するとする。
この時、それぞれの型ではどのようになるか?

・文字型の場合  :"新"
・可変長の場合  :"新島□襄"
・固定長の場合  :"新島□襄□□□□□□"
・テキスト型の場合:"新島□襄"

文字型」の場合、「1文字」しか受け付けないので、「新」以降は切り捨てられる。
可変長」と「テキスト型」の場合は、同じで、入力した通りに値が入る
そして、「固定長」の場合には、10文字になるまで「空白(□)」で埋める

もしも、10文字以上の名前が存在したらどうなるのか?
これも考えてみる。もっと長い名前と言えば...「寿限無」?
といことで、寿限無を入力してみる。

・文字型の場合  :"じ"
・可変長の場合  :"じゅげむ□じゅげむ□"
・固定長の場合  :"じゅげむ□じゅげむ□"
・テキスト型の場合:"じゅげむ□じゅげむ□ごこうのすりきれ
          かいじゃりすいぎょの□すいぎょうまつ
          うんらいまつ□ふうらいまつくうねると
          ころに□すむところ□やぶらこうじの□ぶ
          らこうじ□ぱいぽぱいぽぱいぽのしゅー
          りんがん□しゅーりんがんのぐーりんだ
          い□ぐーりんだいのぽんぽこぴーのぽん
          ぽこなーのちょうきゅうめいのちょうす
          け"

このようになる。「テキスト型」のみは全ての文字を格納できるが、
「文字型」は1文字のみ、「可変長」と「固定長」はともに10文字の限界があるので、
超過した部分は切り捨てられる。

通常は意識したことは無いであろうが、
実は、このような「文字数の制限」というのは、
データベースに限らず、様々な所で出てくる問題である。

なぜ、このように複雑な定義が必要なのか?

最近のコンピュータは、性能が高いので意識することは「少ない」が、
コンピュータのメモリやCPUの負担を少なくするための工夫が現れているのである。
ちょっと大きなデータを扱うと、最新のコンピュータでも処理が追いつかないのである。

ちなみに、少し前までは、引数「n」に指定できる限界値は非常に小さく
128文字(bite)」あるいは、もう少し大きくて、「256文字(bite)」であった。
かつては、限られた資源を上手く使い回すのが腕の見せ所だった。

なお、PostgreSQL 9.1 では、最大で1GBまでサポートされている。
単純に計算すると、2バイト文字で非圧縮の場合4096文字程度まで格納できる計算である。
これよりも長い「文字列」を扱う時には、ちゃんと、仕様書を確認した方が良い。

実際には、文字列を圧縮するようなので、もう少し格納できるかもしれない
文字数限界」については、深く知ろうとすると色々と厄介なのでここでは割愛。
いずれにせよ、長大な「文字列」を扱う際には注意が必要である。

次回は、Python というプログラミング言語を通して、
もう少し、文字列型の性質や操作について考えてみる。

0 件のコメント:

コメントを投稿