Access

Accessの文字列型とメモ型の違い~メモ型を利用する場合の注意点

メモ型テキスト型
記事内に商品プロモーションを含む場合があります

ご存知の通り、Accessでテキストを格納するフィールドの型は2種類あります。
テキスト型とメモ型です。

2つの型の違いの一番のポイントはフィールドサイズで、テキスト型は255文字まで、メモ型は無制限となっています。

ただ、サイズの違いだけではなく扱い方や挙動についても異なる点が多いため基本的にはフィールドサイズが許せばテキスト型を使うことがおすすめです。

メモ型のデメリット

以下、OKWAVEに分かりやすく回答されている方がいましたので引用しました。

要するに、Accessではなるべくメモ型は使わない方が良いということです。

ただ、どうしてもテキスト型では格納しきれない文字列の場合はメモ型を使わざるを得ませんので制約事項や挙動の違いなどを意識して使う必要があります

メモ型というのはオブジェクト型と言われるテーブルとは別の領域に書き込まれるバイナリデーターです。

なんでも入る変わりにテーブルフィールドとは違うので検索が容易ではない、大きくなりすぎると壊れる、インデックスがつけられないなど制約が多いです。

つまりAccess程度でこれを多用するとDBが壊れやすくなるということです

これを本格的に使うものに動画データーベースや画像データーベースなどがあります。

これらは数十テラにもなるオブジェクトをタグ付けして管理するようなシーンにつかいますし、大抵はリレーショナルなDBではありません。

階層型だったりしますね。

Accessについているものはオマケと思ったほうが良く多用は危険。

なるべくStringで納めるのが正しいAccessの使い方です。

引用:OKWAVE

メモ型ではできないこと

インデックスがつけられない

メモ型のフィールドは主キーを設定することができません。

テーブルレイアウトで主キーを設定すると以下のエラーメッセージが表示され、保存することはできません。

OLEオブジェクト型、メモ型、添付ファイル型、および複数値を持つルックアップフィールドには、主キーを設定できません。

クエリーで結合(紐づけ)ができない

クエリーにてメモ型同士のフィールドを結合しようとすると以下のエラーとなります。

メモ型またはOLEオブジェクト型()のフィールドを結合することはできません。

ソートができない

テーブル表示など、データを一覧表示している際、メモ型フィールではソート設定ができません。

フィールドサイズを指定できない

フィールドサイズが無制限なので当たり前のことですが、フィールドサイズを指定することができません。

例えば、255文字ではなくて500文字にしたい場合でも500文字と定義することはできません。

これによって不自由なことと言えば、桁あふれの文字列を自動で制御できないという点です。

つまり、予めサイズを指定したテキストなら、値の入力時そもそも255文字以上は入力できないようになっていますので、あえて文字をカットしたりエラーを表示したりする必要はありません。

これに対してメモ型はサイズ指定ができませんので、

例えば後工程で500の文字列をODBCデータベースの500文字のchar型に格納しようとすると、プログラムで500文字の入力制限をしてあげなければシステムエラー(ODBCのエラー)を起こしてしまいます。

メモ型の挙動の違い

フォームのレコードソースとしてメモ型を持つテーブルが設定されている場合、テキスト型とメモ型では一部挙動が異なる部分があることを今回初めて知りました。

テキスト型のフィールドはレコード更新前の状態(Before Updateイベント時)にもフィールドの値として取得できるのですが

メモ型のフィールドはレコード更新後の状態(After Updateイベント)にならないとフィールドの値を取得できません

これは、前述のメモ型のデメリットで説明されているように、「メモ型というのはオブジェクト型と言われるテーブルとは別の領域に書き込まれる」ことに起因していると思われます。

フォームのレコードソースにテーブルまたはクエリーが定義されている場合、コントロールのコントロールソースとしてテーブル(またはクエリー)のフィールドを指定できます。

この時、フォームのコントロールの値を参照する方法は2種類あります。

  • コントロール名で参照
  • コントロールソースで参照

※コントロール名とコントロールソースを全く同じ名前にしている場合は同じ扱いになります。

テキスト型のテキストコントロールAに「あいうえお」と入力、メモ型のコントロールBに「かきくけこ」と入力し、フォームのBeforUpdateイベントでそれぞれの値を参照すると以下のようになります。

コントロール名で参照 コントロールソースで参照
テキスト型コントロールA あいうえお あいうえお
メモ型コントロールB かきくけこ 空白

メモ型のコントロールBはBeforeUpdateの状態では値を取得できていません。

メモ型とテキスト型の違いまとめ

このようにメモ型には制限事項が合ったり、テキストと同じように扱っていると失敗したりすることもありますので十分に注意しましょう。

↓このような現象も起きます💦

メモ型
メモ型のフィールドをレコードセットで取得すると255文字で切れる?メモ型のフィールド値をクエリーで取得し、レコードセットを取得したら255文字で切られてしまいました。クエリー表示の際は正しく取得できているのになぜ??いろいろ試していたら原因はnz()関数だと分かりましたので経緯を記録しておきます。...

\逆引き辞書があると便利です/
[itemlink post_id=”1386″]

ABOUT ME
アズビーパートナーズ
プログラマー→社内SE→SIerのお仕事をしています。 メーカー勤務を経て、中小企業の社内SE、フリーランスなど様々な形態で働いてきました。 業務上生まれた困った…を解決してきたTipsを備忘録も兼ねて公開しています。 困っている誰かのお役に立てれば幸いです。