sql >> データベース >  >> RDS >> Sqlserver

行あたり8060バイト、(varchar、nvarchar)値あたり8000バイトの制限にどのように到達しますか?

    ストレージエンジンの内部:レコードの構造

    これはSQLServer 2005用です

    • レコードヘッダー
      • 4バイト長
      • 2バイトのレコードメタデータ(レコードタイプ)
      • レコード内でNULLビットマップを指す2バイト
    • レコードの固定長部分。固定長のデータ型(bigint、char(10)、datetimeなど)を格納する列が含まれます。
    • NULLビットマップ
      • レコード内の列数の2バイト
      • 列がNULL可能かどうかに関係なく、レコードの列ごとに1ビットを格納する可変バイト数(これは、NULL可能列ごとに1ビットのみを持っていたSQL Server 2000とは異なり、単純です)
      • これにより、NULLの列を読み取る際の最適化が可能になります
    • 可変長列オフセット配列
      • 可変長列のカウントに2バイト
      • 可変長列ごとに2バイト、列の値バージョン設定タグの最後にオフセットを指定します
    • これはSQLServer2005のみであり、タイムスタンプとtempdbのバージョンストアへのポインタを含む14バイトの構造体です

    つまり、1文字(8000)

    • 4バイト(レコードヘッダー)
    • 8000固定長
    • 3ヌルビットマップ
    • 可変長をカウントするための2バイト
    • 14タイムスタンプ

    ただし、varchar(200)列が40個ある場合

    • 4バイト(レコードヘッダー)
    • 0固定長
    • 6ヌルビットマップ
    • 可変長をカウントするための2バイト
    • 202 x 40 =8080
    • 14タイムスタンプ

    合計=8080+ 4 + 6 + 2 + 14 =8106。WTF?このテーブルを作成すると警告が表示されます

    私はそれにこだわるつもりはありません:この情報にはいいえ 実用的な日々の価値



    1. Oracleでは、このパスをz / y/xからx/y/zに逆にします。

    2. MySQLのBLOB列に入れることができるデータの最大長はどれくらいですか?

    3. エラー:ファイル「$ libdir / plpython2」にアクセスできませんでした–エラー:ファイル「$ libdir/plpython3」にアクセスできませんでした

    4. PostgreSQLバックアップの自動テスト