2012/12/06

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

もちろん、プログラミング言語も。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 件のコメント:

コメントを投稿