ClickHouse считывает Varchar когда у них длинны разного размера (иногда 1 байт, иногда 2 байта и т.д)??🤔
В начале строки хранится длина в формате leb128 Т.е. если строка 1 байт, то хранится 2 байта
Если длина строки например 2048 байт (2 байта на длину)… Как потом знать при чтении , что длина 2 байта?
И можно ссылку в документации что это leb128? Please🙏🏻
https://clickhouse.com/docs/ru/interfaces/formats#rowbinary
Ну и в коде, собственно, реализация: Чтение строки: https://github.com/ClickHouse/ClickHouse/blob/master/src/IO/ReadHelpers.h#L127 Чтение длины: https://github.com/ClickHouse/ClickHouse/blob/master/src/IO/VarInt.h#L101 Как видно в длину попадают 7 младших битов из байта, если в старшем бите байта не 1 (if (!(byte & 0x80))), то чтение длины прекращается, а если 1, то она идёт дальше, и каждые следующие 7 младших битов помещаются в более старшие 7 битов итоговой длины.
Это даже в Википедии описано. Спросите gpt
Не сыпь мне соль на рану! Я убила 4 часа после того как чат рассказал мне байку с полной уверенностью, что стринги в CH хранятся без размера, а с нулями в конце🤦🏼♀️ И не только в Википедии, даже в документации не так просто понять что и как сохраняется на диске
GPT страдает от галлюцинаций, я не советую ему доверять что-то серьёзнее генерации boilerplate кода.
ну про ClickHouse gpt спрашивать смысла нет. Просто leb128 очень известный формат. explain in russian what is LEB128 ChatGPT LEB128 (Little Endian Base 128) - это переменная длина кодирования, которое используется для эффективного кодирования целых чисел. Он использует схему сжатия длины, которая позволяет записывать целые числа разной длины в зависимости от их значения. В LEB128 каждый байт представляет собой семь бит данных, а восьмой бит служит как флаг продолжения, указывающий, что байт содержит продолжение числа. Число кодируется в младших битах первого байта и продолжается в следующих байтах, если флаг продолжения установлен. Таким образом, использование LEB128 позволяет кодировать целые числа с меньшим количеством байтов, чем при использовании фиксированной длины кодирования, что делает его очень полезным для хранения целых чисел в памяти и передачи их по сети.
Так хранится FixedString https://clickhouse.com/docs/en/sql-reference/data-types/fixedstring И эти самые нули приходят на клиент (или раньше приходили).
Не совсем, в FixedString будет padding нулями только если длина меньше N… но если строчки точно длинной N, то не будут там нули
ага, все так. проблемы или неожиданности возникают ровно в момент "длина меньше N".
Обсуждают сегодня