CREATE TABLE `character_provider_bindings` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `global_character_id` BIGINT NOT NULL, `look_version_id` BIGINT NULL, `source_asset_id` BIGINT NULL, `provider_code` VARCHAR(100) NOT NULL, `provider_asset_type` VARCHAR(50) NOT NULL DEFAULT 'video_character_element', `provider_element_id` VARCHAR(191) NOT NULL, `element_name` VARCHAR(160) NOT NULL, `element_description` TEXT NULL, `source_duration` DECIMAL(5,2) NULL, `voice_bound` BOOLEAN NOT NULL DEFAULT false, `voice_id` VARCHAR(160) NULL, `voice_description` TEXT NULL, `binding_version` INTEGER NOT NULL DEFAULT 1, `validation_score` DECIMAL(5,2) NULL, `validation_report_json` JSON NULL, `status` VARCHAR(50) NOT NULL DEFAULT 'candidate', `is_primary` BOOLEAN NOT NULL DEFAULT false, `created_by_user_id` BIGINT NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, UNIQUE INDEX `cpb_provider_element_key`(`provider_code`, `provider_element_id`), INDEX `cpb_character_provider_status_idx`(`global_character_id`, `provider_code`, `status`), INDEX `cpb_look_version_idx`(`look_version_id`), INDEX `cpb_source_asset_idx`(`source_asset_id`), INDEX `cpb_primary_status_idx`(`is_primary`, `status`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; UPDATE `provider_configs` SET `config_json` = JSON_SET( COALESCE(`config_json`, JSON_OBJECT()), '$.aspect_ratio', '16:9', '$.allowed_aspect_ratios', JSON_ARRAY('16:9'), '$.production_aspect_ratio', '16:9' ) WHERE `provider_type` IN ('ImageProvider', 'VideoProvider'); UPDATE `provider_configs` SET `config_json` = JSON_SET(`config_json`, '$.size', '2560x1440') WHERE `provider_type` = 'ImageProvider' AND JSON_UNQUOTE(JSON_EXTRACT(`config_json`, '$.size')) = '1440x2560'; UPDATE `provider_configs` SET `config_json` = JSON_SET(`config_json`, '$.size', '1536x1024') WHERE `provider_type` = 'ImageProvider' AND JSON_UNQUOTE(JSON_EXTRACT(`config_json`, '$.size')) = '1024x1792'; UPDATE `provider_configs` SET `config_json` = JSON_SET( `config_json`, '$.width', CAST(JSON_UNQUOTE(JSON_EXTRACT(`config_json`, '$.height')) AS UNSIGNED), '$.height', CAST(JSON_UNQUOTE(JSON_EXTRACT(`config_json`, '$.width')) AS UNSIGNED) ) WHERE `provider_type` IN ('ImageProvider', 'VideoProvider') AND JSON_TYPE(JSON_EXTRACT(`config_json`, '$.width')) IN ('INTEGER', 'DOUBLE') AND JSON_TYPE(JSON_EXTRACT(`config_json`, '$.height')) IN ('INTEGER', 'DOUBLE') AND CAST(JSON_UNQUOTE(JSON_EXTRACT(`config_json`, '$.width')) AS UNSIGNED) < CAST(JSON_UNQUOTE(JSON_EXTRACT(`config_json`, '$.height')) AS UNSIGNED);