{
    "id": "pdo179-attachment-roundtrip",
    "title": "Восстановить выбранное вложение без потери NUL и FF",
    "columns": [
        "Наблюдение",
        "Результат"
    ],
    "rows": [
        [
            "attachment.bin",
            "13 байт; NUL и FF сохранены"
        ],
        [
            "Полученные байты",
            "50444F5F44424C494200FF100A"
        ],
        [
            "SHA256",
            "bf345993a33529a3be5bf98a84c2281cc32cf3e85262bcda1811353e554d3e96"
        ],
        [
            "empty.bin",
            "Файл есть: 0 байт; IS NULL = 0"
        ],
        [
            "missing.bin",
            "Вложения нет: IS NULL = 1"
        ],
        [
            "Файл",
            "attachment.bin: точная копия выбранного тела"
        ]
    ],
    "checks": {
        "selected_body_exact": true,
        "file_exact": true,
        "catalog_bounded": true,
        "empty_not_null": true,
        "sql_null_missing": true,
        "source_binary_kept": true,
        "owned_objects_removed": true
    },
    "observations": {
        "catalog": [
            {
                "id": 1,
                "filename": "attachment.bin",
                "is_missing": 0,
                "byte_count": 13
            },
            {
                "id": 2,
                "filename": "empty.bin",
                "is_missing": 0,
                "byte_count": 0
            },
            {
                "id": 3,
                "filename": "missing.bin",
                "is_missing": 1,
                "byte_count": null
            }
        ],
        "selected_id": 1,
        "raw_fetch_type": "string",
        "payload_hex": "50444F5F44424C494200FF100A",
        "bytes": 13,
        "sha256": "bf345993a33529a3be5bf98a84c2281cc32cf3e85262bcda1811353e554d3e96",
        "empty_fetch_type": "string",
        "empty_fetch_bytes": 0,
        "missing_fetch_type": "null",
        "input_contract": "ASCII hex PARAM_STR_CHAR → SQL CONVERT(varbinary(max),?,2)",
        "output_contract": "VARBINARY → исходные байты PHP string → file_put_contents; без hex2bin"
    },
    "runtime": {
        "php": "8.5.11",
        "extension": "8.5.11",
        "pdo": "8.5.11",
        "driver": "dblib",
        "server_version": "17.0.5035.5",
        "client": "freetds v1.3.17",
        "tds_version": "7.4",
        "database": "phpmanual179",
        "transport": "private_loopback_tcp"
    },
    "owned_objects": [
        {
            "type": "TABLE",
            "name": "pdo179_attachment_a268209e1bfc"
        }
    ],
    "removed_objects": [
        {
            "type": "TABLE",
            "name": "pdo179_attachment_a268209e1bfc"
        }
    ]
}
