Сжатые данные в двоичном столбце в красноречивом phpPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Сжатые данные в двоичном столбце в красноречивом php

Сообщение Anonymous »

Я храню обычный текст ASCII в виде сжатого BLOB-объекта zlib в столбце pgsql BYTEA.
Мое определение схемы laravel для таблицы:

Код: Выделить всё

$table->binary('data')->nullable();
Вот мой красноречивый класс модели:

Код: Выделить всё

protected function casts(): array
{
return [
'data' => Compressed::class,
];
}
Атрибут пользовательского приведения:

Код: Выделить всё

class Compressed implements CastsAttributes
{
public function get(Model $model, string $key, mixed $value, array $attributes): mixed
{
return blank($value) ? null : gzinflate($value);
}

public function set(Model $model, string $key, mixed $value, array $attributes): mixed
{
return blank($value) ? null : gzdeflate($value);
}
}
Однако, когда я пытаюсь сохранить модель, я получаю следующую ошибку:

Код: Выделить всё

SQLSTATE[22021]: Character not in repertoire: 7 ERROR: invalid byte sequence for encoding "UTF8": 0x82 CONTEXT: unnamed portal parameter $1 (Connection: pgsql, SQL: update "table" set "data" =....
Я думал, что eloquent/PDO автоматически экранирует байтовые данные. В любом случае, я обновил код приведения, чтобы явно экранировать данные:

Код: Выделить всё

class Compressed implements CastsAttributes
{
public function get(Model $model, string $key, mixed $value, array $attributes): mixed
{
if (blank($value)) {
return null;
}

$my_bytea = stream_get_contents($value);
//$my_bytea = pg_unescape_bytea($my_bytea);

return gzinflate($my_bytea);
}

public function set(Model $model, string $key, mixed $value, array $attributes): mixed
{
return blank($value) ? null : pg_escape_bytea(gzdeflate($value));
}
}
Теперь я могу сохранить данные. Но я не могу прочитать это обратно. Я получаю следующую ошибку:

Код: Выделить всё

gzinflate(): data error
Что я делаю не так?

Подробнее здесь: https://stackoverflow.com/questions/793 ... oquent-php
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»