低コードプラットフォームBudibaseを活用する際、表名に日本語や特殊文字を使用するとデータベースで不正な文字表示が発生する問題が頻繁に報告されています。PostgreSQLやMySQLなど複数のデータベースと連携する際に、表名の文字コード不一致が原因でクエリ失敗や関連付けエラーが発生するケースが確認されています。
この問題の根本原因は、データベース接続設定に文字コードの明示的指定がなく、表名処理フローで一貫したエンコード変換が行われていない点にあります。特にMySQLではデフォルトでlatin1を使用するため、UTF-8で格納された表名が破損する現象が発生します。
対策として以下の手順を実施してください:
- データベース接続設定で文字コードを明示的に指定します。MySQLの例では接続文字列に
encoding=utf8mb4を追加します。 - 表名処理にエンコード変換レイヤーを導入します。以下の関数を
packages/string-templates/src/conversion/index.tsに追加します:
function encodeTableName(name: string): string {
return Buffer.from(name, 'utf8').toString('hex');
}
function decodeTableName(encoded: string): string {
return Buffer.from(encoded, 'hex').toString('utf8');
}
// テーブル名処理フローに適用
function processTableName(name: string): string {
return isTableIdentifier(name) ? encodeTableName(name) : name;
}さらにデータベース固有の処理を実装します。packages/server/src/integrations/tests/utils/index.tsのgetDatasource関数を修正:
async function getDatasource(name: string) {
const ds = await providers[name]();
if (ds?.type === 'mysql') {
ds.config.encoding = 'utf8mb4';
} else if (ds?.type === 'postgres') {
ds.config.encoding = 'utf8';
}
return ds;
}表名のバリデーションを強化するため、packages/shared-core/src/table.tsに以下のチェックを追加:
export function validateTableName(name: string): boolean {
return /^[a-zA-Z0-9_\-]+$/.test(name) &&
name.length <= 63;
}
// 作成前チェック
export function createTable(table: Table) {
if (!validateTableName(table.name)) {
throw new Error('Invalid table name format');
}
// 通常の処理
}実装時の注意点として、既存データベースの表名変換には事前のバックアップが必須です。また、各データベースの文字コード対応をテストする際は、PostgreSQLのutf8とMySQLのutf8mb4の違いを考慮する必要があります。