[ In the following, a character refers to a string element. For example, string $str has length($str) characters, which can be obtained using substr($str, $index, 1). Whether that character represents a byte, a Unicode Code Point, or something else is of no consequence. ]
OFFSET is (unconditionally) a number of characters. Usually, one passes the length of SCALAR.
sysread($fh, $buf, BLOCK_SIZE, length($buf))
LENGTH is (unconditionally) the maximum number of characters to add to SCALAR. For a non-binary handle, this may result in more bytes read than LENGTH.
The return value is (unconditionally) the number of characters added to SCALAR. For a non-binary handle, this may be less than the number of bytes read.