PostgreSQLがヌル文字を拒絶することをご存じですか


jiro  2026-10-11 10:24:38  No: 152319

回りくどい表現になりましたが、現在ウェブサービスをWebbrokerにPostgresをつかって鋭意製作中です。表題の通りヌル文字を弾くのはよいのですがフォームから取得したデータが同じエラーでデータベースに記録されません。
回避策はとっているのですがどれも全く効果がありません。とっかかりはないでしょうか。
手掛かりになればと思いコードを掲載しておきます

// Request.ContentFields の代わりに使用する安全な関数
function GetSafePostValue(Request: TWebRequest; const FieldName: string): string;
var
  RawBytes: TBytes;
  RawStr: string;
  Params, Pair: TArray<string>;
  P: string;
begin
  Result := '';

  // 1. 生のバイトデータを取得(OSの文字コード干渉を完全に防ぐ)
  RawBytes := Request.RawContent;

  // ※もしISAPIなどで長文が切れる(RawContentが空、またはサイズ不足)場合のフェイルセーフ
  if (Length(RawBytes) = 0) and (Request.ContentLength > 0) then
  begin
    RawStr := Request.ReadString(Request.ContentLength);
  end
  else
  begin
    // URLエンコードされたデータはASCIIのみで構成されるため、ASCIIとして文字列化
    RawStr := TEncoding.ASCII.GetString(RawBytes);
  end;

  if RawStr = '' then Exit;

  // 2. TStringList のバグを避けるため、String.Split で安全に '&' を分割
  Params := RawStr.Split(['&']);

  for P in Params do
  begin
    // 3. '=' で名前と値に分割
    Pair := P.Split(['=']);
    if (Length(Pair) = 2) and SameText(Pair[0], FieldName) then
    begin
      try
        // 4. 空白の処理と、UTF-8としてのURLデコード
        Result := TNetEncoding.URL.Decode(Pair[1].Replace('+', ' '))
          .Replace(#0,'',[rfReplaceAll]).Replace(#1,#2,[rfReplaceAll]);
      except
        // 万が一、ユーザーが不正なパーセントエンコードを送ってきた場合のエラー回避
        on E: Exception do
          Result := ''; // またはエラーログを出力
      end;
      Break;
    end;
  end;
end;


※作成する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。







   このエントリーをはてなブックマークに追加