文字列フィールドの文字数上限について

内容

ふと、文字列フィールドに文字数の上限ってあるのだろうか?と思い、調べてみましたがぱっと出てこなかったので、自分で試してみることにしました。

前提

kintone のヘルプには、各フィールドの入力制限をまとめたページがあります。

ここには、重複禁止を設定した場合の制限しか書かれておらず、通常時の制限については記載がありません。

他のページに書いてあるのか?と探したものの、スペースやスレッドは上限値 65,535文字 というページがありましたが、それ以外には見つかりませんでした。

準備

というわけで、実際にアプリを作って調べてみました。

対象のフィールドは、一旦、文字列(1行)、文字列(複数行)、リッチエディターとしました。

文字数のカウントは目視だと絶対に分からないので、カウントするプログラムを組みました。

(() => {
  'use strict';
  kintone.events.on('app.record.detail.show', (event) => {
    const element = kintone.app.record.getSpaceElement('SPACE');
    if (element instanceof HTMLDivElement) {
      makeCountDisp(element);
    }
  });
  kintone.events.on('app.record.create.show', (event) => {
    const element = kintone.app.record.getSpaceElement('SPACE');
    if (element instanceof HTMLDivElement) {
      makeCountDisp(element);
    }
  });
  kintone.events.on('app.record.edit.show', (event) => {
    const element = kintone.app.record.getSpaceElement('SPACE');
    if (element instanceof HTMLDivElement) {
      makeCountDisp(element);
    }
  });
  
  let intervalNum = undefined;
  
  function makeCountDisp(element) {
    const line1 = document.createElement('div');
    const line1Text = document.createTextNode('文字列(1行): ');
    const line1Count = document.createElement('span');
    const line2 = document.createElement('div');
    const line2Text = document.createTextNode('文字列(複数行): ');
    const line2Count = document.createElement('span');
    const line3 = document.createElement('div');
    const line3Text = document.createTextNode('リッチエディター: ');
    const line3Count = document.createElement('span');
    
    line1.appendChild(line1Text);
    line1.appendChild(line1Count);
    line2.appendChild(line2Text);
    line2.appendChild(line2Count);
    line3.appendChild(line3Text);
    line3.appendChild(line3Count);
    element.appendChild(line1);
    element.appendChild(line2);
    element.appendChild(line3);
    
    if (intervalNum !== undefined) clearInterval(intervalNum);
    
    intervalNum = setInterval(() => {
      const { record } = kintone.app.record.get();
      line1Count.innerText = record.文字列__1行_.value?.length;
      line2Count.innerText = record.文字列__複数行_.value?.length;
      line3Count.innerText = record.リッチエディター.value?.length;
    }, 100);
  }
})();

これで、フィールドに大量に文字を入力して保存できるかどうか試します。

とりあえず入力する文字は「1234567890」を倍々ゲームの要領でコピペすることにしました。

結果

以下の内容が保存できました。

少なくとも 5,242,880文字 (約525万文字)保存できます

※ Chrome の表示がバグって文字列(複数行)のフィールドが消えかかってます……

考察

ヘルプの通り、文字列フィールドには基本的に文字数制限は存在しないようです。

ただし、この後一気に1フィールド 約1,000万文字 に挑戦してみたところ、データ量が多すぎて保存ができないというエラーが起きました。フィールド単体でのエラーというより、レコードの容量でエラーが起きるみたい。

なお、今回 約525万文字 を3フィールド = 約1,575万文字 を1レコードに保存したところ、ページの動作も保存ボタンを押した後も動きが非常にもっさりしており、編集画面の表示もおかしくなりました。これが通常運用だとしたら結構ストレスになるなぁという印象です。特に Core i7 + 16GBメモリ を積んだノートPCでこれなので、一般的な事務の方のPCだと固まって復帰してこなくなりそうですね。

「いいね!」 4

ちなみにリッチエディターの文字数がほかのフィールドより多いのは、自動的に HTML タグが挿入されるからです。レコード新規作成の状態で何も入力していなかったとしても 17文字 は入力されたことになっています。

「いいね!」 3

プログラムで入力文字を増やしていったのかとおもったのですが、プログラム内には増やしている部分はありませんでした。

10文字を倍々ゲームで増やしていくとたった19回のコピーアンドペーストで524万字になるんですね。勉強になりました。

「いいね!」 1

コピペの回数までカウントしてませんでしたが、確かに 19回 であの文字数になる計算ですね。厳密には 19回 × 3 = 57回 Ctrl + V を押したことになる…そんなに押したっけな?

あと計算して思ったんですが、 1,024 で割ったら 512 になるってことは 524,288バイト = 512キビバイト ってことになりますね。 512キビバイト って一番下の桁 0じゃないんだ……知らなかった……

「いいね!」 1