2012/12/06

文系のための「データ型」

これまでの話から、コンピュータは、2進数と呼ばれる「1」と「0」の値によって、
データを扱っていることは理解できているハズ。
ONとOFFのスイッチの組合せで動いているとも言える。

また、重要なこととして、同じ2進数による表現であっても、
対応表を参照する方法と、10進数を2進数変換した数値で扱う方法の、
二種類方法が存在していることも理解できているはず。

例えば、ASCII文字コードに代表される「文字」は、対応表による方法であり、
色の場合は、8bitの場合には、256段階の色の強さを2進数の数値で表した方法であった。
もちろん、通常の計算は、2進数の計算で対応できるのであった。

そうそう。同じ「数」であっても、「数字」と「数値」は別のもの。
見た目が同じでも、コンピュータは、別のものとして扱うのだった。
では、こういったことを知っていないと、どのようなことで困るか?

エクセルなどの表計算ソフトを使っていて、
次ような問題に出会ったことは無いだろうか?

ID番号と思っていたものが勝手に日付になったり、
足し算しないといけないにも関わらず、なぜか、計算できていなかったり...。
あるいは、小数点以下の数値が勝手に四捨五入されていたり、ということもある。

知っていれば、こういった問題に頭を抱えることが激減する。自力で解決できる。

コンピュータのデータの扱い型を知ることは、ある居程度は重要なことである。
「文系」とか「理系」とかではなく、無用な仕事を増やさぬためにも。
実際に、こうした問題で相談を受けることは少なくない。いや、多い。

もちろん、これらの質問に対して、不快に感じたことは無いが、
現実問題として、文系であってもコンピュータで困ることはある。
「文系だからそこまで知らなくてもね〜」と言ったのは誰だったか...。

「文系は使えれば良い派」には断固として反対。

さて、そんな愚痴っぽい批判のようなことはさておき、
コンピュータの仕組みをある程度知っておいて損は無い。
応用も利くし、複雑な処理が、簡単な処理で済むことが極めて多い。

理解しておくべきことは、人が目で見て理解していることと、
コンピュータが理解できることは全く異なるということ。それゆえに、
人が当たり前にできるようなことであっても、コンピュータが出来ないことも多い。

日付の計算は、その代表的な例と言える。「12月31日」の次の日は?
普通の人は、「1月1日」と答えるであろう。常識である。
しかしながら、うっかりすると、コンピュータは「12月32日」と答える。

コンピュータは、それほど賢いものでは無い。

では、人が当たり前のように行なっているような、
非常に複雑な手続きを扱うために、どのような仕組みを持っているのか?
というのが今回の話のテーマ。

キーワードは「データ型」。

一般的に、「データ型」と呼ばれる存在は、
この問題を解決するために生み出された「苦肉の策」的仕組みである。
この仕組みは、理想的とは言えないものの、現在の唯一の手段である。

簡単に言うと、人がコンピュータに何らかの命令を与える時に、
扱うべきデータが、文字なのか数値なのかを教えてやる、という方法。
文字と数値だけではな無い。日付、時間、図形といった「型」を教えてやる。

コンピュータに様々な「型」の種類と、その「型」特有の処理方法を与えておけば、
コンピュータはその通りにデータを処理してくれる。
人が、コンピュータに合せてやるということが必要ではあるが...。

さて、この話をスムーズに理解できた人にとっては「それで?」と思うかもしれない。
「一つずつそのデータ型とやらの説明してくれれば良いではないか?」とも思うかも。
実を言うと、それほど単純ではない。例えば、こうした「型」は環境によって定義が異なる。

Microsoft Excel という馴染み深い表計算ソフトが扱う「データ型」と、
PostgreSQL などのデータベース管理システムが扱う「データ型」、
C言語よ呼ばれるプログラミングが扱う「データ型」は、それぞれ、定義が異なる。

さらに、同じMicrosoft Excel であっても、「データ型」に関して、
なぜか、Windows版とMac版で微妙に異なる部分があるなど、
一つでは説明しきれないことも色々とある。

同じデータベース管理システムであっても同様。PostgreSQL、Oracle、
DB2、SQL Server、SQLite、Access といった商品毎によって、
「データ型」の定義は、多かれ少なかれ、違いがある。

もちろん、プログラミング言語も。C言語、PL/I、Delphi、COBOL、Python、Ruby、
などなど、これら意外にも、数えきれないほどプログラミング言語は存在するが、
プログラミング言語によって、「データ型」の定義が異なる。

さて、この問題は、「データ型」についての知識を「教える側」としては、
非常に悩み深い問題でなのである。すなわち、何をベースにするべきか...。
どれを選んでも、多少の矛盾が出てきてしまう。

ということで、悩みに悩んだ末、PostgeSQLとPythonの「データ型」をベースに、
以下の話を進めていくことにする。この二つを対照させながら、
データ型について整理することにする。

ただし、PostgreSQL のデータ型は非常に多いので、全ては説明せず、
一般論として関係しそうな基本的なデータ型に重点を置いて整理することにする。

なお、以下の表は、PostgreSQL 9.1 のデータ型の一覧である。
赤字の所が、現在、説明を予定しているデータ型。
名称別名説明
bigintint88バイト符号付き整数
bigserialserial8自動増分8バイト整数
bit [ (n) ]固定長ビット列
bit varying [ (n) ]varbit可変長ビット列
booleanbool論理値(真/偽)
box平面上の矩形
byteaバイナリデータ("バイトの配列(byte array)")
character varying [ (n) ]varchar [ (n) ]可変長文字列
character [ (n) ]char [ (n) ]固定長文字列
cidrIPv4もしくはIPv6ネットワークアドレス
circle平面上の円
date暦の日付(年月日)
double precisionfloat8倍精度浮動小数点(8バイト)
inetIPv4もしくはIPv6ホストアドレス
integerint, int44バイト符号付き整数
interval [ fields ] [ (p) ]時間間隔
line平面上の無限直線
lseg平面上の線分
macaddrMAC(メディアアクセスコントロール)アドレス
money貨幣金額
numeric [ (p, s) ]decimal [ (p, s) ]精度の選択可能な高精度数値
path平面上の幾何学的経路
point平面上の幾何学的点
polygon平面上の閉じた幾何学的経路
realfloat4単精度浮動小数点(4バイト)
smallintint22バイト符号付き整数
serialserial4自動増分4バイト整数
text可変長文字列
time [ (p) ] [ without time zone ]時刻(時間帯なし)
time [ (p) ] with time zonetimetz時間帯付き時刻
timestamp [ (p) ] [ without time zone ]日付と時刻(時間帯なし)
timestamp [ (p) ] with time zonetimestamptz時間帯付き日付と時刻
tsqueryテキスト検索問い合わせ
tsvectorテキスト検索文書
txid_snapshotユーザレベルのトランザクションIDスナップショット
uuid汎用一意識別子
xmlXMLデータ


0 件のコメント:

コメントを投稿