-- 同 20260917114313_init_identity:Prisma 生成的 MySQL DDL 固定写 -- utf8mb4_unicode_ci,会覆盖库级 utf8mb4_0900_bin;照片与上传域 -- (photos.objectKey、upload_sessions.objectKey、outbox_events.type 等) -- 同样依赖 bin 校对的大小写敏感语义,故逐表改写为 utf8mb4_0900_bin。 -- CreateTable CREATE TABLE `photos` ( `id` VARCHAR(191) NOT NULL, `albumId` VARCHAR(64) NOT NULL, `uploaderId` VARCHAR(64) NOT NULL, `categoryId` VARCHAR(64) NULL, `objectKey` VARCHAR(255) NOT NULL, `bytes` INTEGER NOT NULL DEFAULT 0, `width` INTEGER NULL, `height` INTEGER NULL, `shotAt` DATETIME(6) NULL, `uploadedAt` DATETIME(6) NULL, `publishedAt` DATETIME(6) NULL, `processingState` VARCHAR(191) NOT NULL DEFAULT 'pending_upload', `errorCode` VARCHAR(64) NULL, `visibility` VARCHAR(191) NOT NULL DEFAULT 'unpublished', `likeCount` INTEGER NOT NULL DEFAULT 0, `entityVersion` INTEGER NOT NULL DEFAULT 1, UNIQUE INDEX `photos_objectKey_key`(`objectKey`), INDEX `photos_albumId_visibility_publishedAt_id_idx`(`albumId`, `visibility`, `publishedAt`, `id`), INDEX `photos_albumId_uploaderId_uploadedAt_idx`(`albumId`, `uploaderId`, `uploadedAt`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin; -- CreateTable CREATE TABLE `photo_variants` ( `photoId` VARCHAR(64) NOT NULL, `variant` VARCHAR(32) NOT NULL, `objectKey` VARCHAR(255) NOT NULL, `bytes` INTEGER NOT NULL, `version` INTEGER NOT NULL DEFAULT 1, `width` INTEGER NULL, `height` INTEGER NULL, UNIQUE INDEX `photo_variants_objectKey_key`(`objectKey`), UNIQUE INDEX `photo_variants_photoId_variant_key`(`photoId`, `variant`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin; -- CreateTable CREATE TABLE `upload_sessions` ( `id` VARCHAR(191) NOT NULL, `userId` VARCHAR(64) NOT NULL, `albumId` VARCHAR(64) NOT NULL, `clientTaskId` VARCHAR(128) NOT NULL, `photoId` VARCHAR(64) NOT NULL, `objectKey` VARCHAR(255) NOT NULL, `expectedBytes` INTEGER NOT NULL, `contentType` VARCHAR(128) NOT NULL, `multipartId` VARCHAR(255) NULL, `state` VARCHAR(191) NOT NULL DEFAULT 'pending', `expiresAt` DATETIME(6) NOT NULL, `createdAt` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), UNIQUE INDEX `upload_sessions_photoId_key`(`photoId`), UNIQUE INDEX `upload_sessions_objectKey_key`(`objectKey`), UNIQUE INDEX `upload_sessions_userId_clientTaskId_key`(`userId`, `clientTaskId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin; -- CreateTable CREATE TABLE `photo_jobs` ( `id` VARCHAR(191) NOT NULL, `photoId` VARCHAR(64) NOT NULL, `type` VARCHAR(32) NOT NULL DEFAULT 'process', `state` VARCHAR(191) NOT NULL DEFAULT 'pending', `attempt` INTEGER NOT NULL DEFAULT 0, `errorCode` VARCHAR(64) NULL, `nextRetryAt` DATETIME(6) NULL, `updatedAt` DATETIME(6) NOT NULL, INDEX `photo_jobs_state_nextRetryAt_idx`(`state`, `nextRetryAt`), UNIQUE INDEX `photo_jobs_photoId_type_key`(`photoId`, `type`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin; -- CreateTable CREATE TABLE `outbox_events` ( `id` VARCHAR(191) NOT NULL, `type` VARCHAR(64) NOT NULL, `albumId` VARCHAR(64) NOT NULL, `photoId` VARCHAR(64) NULL, `entityVersion` INTEGER NOT NULL, `payload` JSON NOT NULL, `occurredAt` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `deliveredAt` DATETIME(6) NULL, INDEX `outbox_events_deliveredAt_occurredAt_idx`(`deliveredAt`, `occurredAt`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin;