データベースでのUnicode正規化

PostgreSQL、MySQL、SQLite、MongoDBでUnicode正規化を処理する方法を学びます。正規化されたテキストの保存がデータの不整合と検索失敗を防ぐ理由を理解します。

Use Cases

詳細な説明

データベースでの正規化

データベースはテキストをバイトとして保存し、ほとんどのデータベースはINSERT時に自動的にUnicodeを正規化しません。同じ視覚的テキストが異なるバイト列で保存される可能性があります。

重複問題

正規化なしでは、ユーザー名カラムのUNIQUE制約が両方を許可する可能性があります:

  • café (NFC形式)
  • café (NFD形式)

PostgreSQL

PostgreSQL 13+ではnormalize()関数が使用可能:

SELECT normalize('é', NFC);
SELECT normalize('é', NFC);
-- どちらも'é'を返す

ベストプラクティス:書き込み時に正規化

const normalized = userInput.normalize("NFC");
await db.insert({ name: normalized });

ユースケース

ユーザー生成テキスト(特に名前、ユーザー名、メールアドレス、検索語)をデータベースに保存するアプリケーションにとって重要です。正規化なしでは、一意制約をバイパスする見えない重複がデータベースに含まれる可能性があります。

試してみる — Unicode Normalizer

フルツールを開く