On 2019-11-13 17:37, blackfalconsoftw...@outlook.com [firebird-support] 
wrote:
> Your statement, which may be true, does not sit well with a previous
> statement that states that a VARCHAR field of 1000 characters is
> stored in the table with 1000 characters.
> 
> Your statement is suggesting a null length (until the field is
> updated) with two bytes for an actual length, which is how VARCHAR
> fields work in all other databases to my knowledge.  Otherwise, to
> follow the previous statement, a Firebird table could have a VARCHAR
> field for 1000 characters, be stored as such with the initial
> storage-info bytes holding the actual length, which would be 1000.
> When the field is updated to lets say 20 characters of data, the field
> would still have an actual size of 1000 characters but the
> storage-info would be 20.
> 
> How does this make any sense?

A record on-disk is a compressed version of the in-memory image of the 
data of a row. A VARCHAR(1000) in server memory has 2 bytes for the 
actual data and 1000 bytes for the data, and 2 bytes padding to make it 
a multiple of 4. Bytes beyond the actual data length are zeroed-out. 
When written to disk, a RLE compression is applied, so a VARCHAR(1000) 
containing 'A' will be something like (in hexadecimal):

03 01 00 41 80 00 80 00 80 00 80 00 80 00 80 00 80 00 97 00

Where
03 means: next 3 bytes literally
01 00 means: actual length 1
41 means: literally A
80 00 means: repeat 128 times 00 (x7)
97 00 means: repeat 105 times 00

These last two give a total of 1001 0x00 bytes (zero-padded value + 
additional padding to make it a multiple of 4.

A CHAR(1000) with value A would be encoded as:
01 41 80 20 80 20 80 20 80 20 80 20 80 20 80 20 99 20

Where:
01 menas: next 1 bytes literally
41 means: literally A
80 20 means: repeat 128 times 20 (space) (x7)
99 20 means: repeat 103 times 20 (space)

These last two give a total of 999 0x20 bytes (space-padded value), no 
additional padding because value is already a multiple of 4.

NOTE: I might have some details wrong, but this is how it basically 
work. The Firebird Internal docoument, section data page also describes 
this: 
https://firebirdsql.org/file/documentation/reference_manuals/reference_material/html/fbint-page-5.html

Mark
        • [fi... blackfalconsoftw...@outlook.com [firebird-support]
        • Re:... Dimitry Sibiryakov s...@ibphoenix.com [firebird-support]
        • [fi... blackfalconsoftw...@outlook.com [firebird-support]
        • Re:... Dimitry Sibiryakov s...@ibphoenix.com [firebird-support]
        • Re:... Mark Rotteveel m...@lawinegevaar.nl [firebird-support]
        • Re:... blackfalconsoftw...@outlook.com [firebird-support]
        • Re:... Dimitry Sibiryakov s...@ibphoenix.com [firebird-support]
        • Re:... blackfalconsoftw...@outlook.com [firebird-support]
        • Re:... Dimitry Sibiryakov s...@ibphoenix.com [firebird-support]
        • Re:... Mark Rotteveel m...@lawinegevaar.nl [firebird-support]
        • Re:... Mark Rotteveel m...@lawinegevaar.nl [firebird-support]
    • Re: [firebi... Ann Harrison aharri...@ibphoenix.com [firebird-support]
  • Re: [firebird-su... Richard Damon rich...@damon-family.org [firebird-support]
    • Re: [firebi... Dimitry Sibiryakov s...@ibphoenix.com [firebird-support]
    • [firebird-s... Mark Rotteveel m...@lawinegevaar.nl [firebird-support]
  • Re: [firebird-su... Mark Rotteveel m...@lawinegevaar.nl [firebird-support]
    • Re: [firebi... blackfalconsoftw...@outlook.com [firebird-support]
      • Re: [fi... Dimitry Sibiryakov s...@ibphoenix.com [firebird-support]
      • Re: [fi... Mark Rotteveel m...@lawinegevaar.nl [firebird-support]

Reply via email to