@Artem0071
Безработный mr. Junior

Binary UUID в Laravel с Postgres?

Есть нужда хранить айдишник в формате UUID
Почитав различные источники было решено генерировать uuid, переводить его в бинарник и в таком виде хранить в БД, а при выводе конвертировать его из бинарного вида в обычный uuid

Что было сделано:

В миграции:
$table->binary('id')->primary();

В модели:
parent::creating(static function (self $model) {
            $model->setIncrementing(false);
            $model->{$model->getKeyName()} = Uuid::uuid4()->toString();
        });


Все это хорошо работает но в sqlite, при миграции в postgres происходит ошибка:
SQLSTATE[22021]: Character not in repertoire: 7 ERROR:  invalid byte sequence for encoding "UTF8": 0x85 (SQL: insert into "users" ("name", "email", "email_verified_at", "password", "remember_token", "id", "updated_at", "created_at") values (Rocky Bartoletti, coy.pouros@example.org, 2020-05-06 08:03:08, $2y$10$b/4r5FCM5tlAj6XG1fu7Ie4OPFmS5BhU3ssKAswbo2yUTYerOpI2W, IctZ1tOPQg, ��z�]�Dq�7��6L�
                                               , 2020-05-06 08:03:08, 2020-05-06 08:03:08))


С постгресом пока что на Вы и не могу понять что он от меня хочет.. Как я понял из интернетов он плохо воспринимает бинарник в UTF'е
Колонка которая создается при миграции имеет формат bytea

Попробовал скопировать данный запрос и вставить напрямую в бд:
insert into "users" ("name", "email", "email_verified_at", "password", "remember_token", "id", "updated_at",
                     "created_at")
values ('Rocky Bartoletti', 'coy.pouros@example.org', '2020-05-06 08:03:08', '$2y$10$b/4r5FCM5tlAj6XG1fu7Ie4OPFmS5BhU3ssKAswbo2yUTYerOpI2W', 'IctZ1tOPQg', '��z�]�Dq�7��6L�
                                               ', '2020-05-06 08:03:08', '2020-05-06 08:03:08')

Вставилось все ок, но возможно это из-за ковычек, без ковычек он ругается на ']', но думаю что он просто попробовал перевести в строку и на самом деле там другой знак

В общем, я уже не понимаю что тут надо делать и куда смотреть.. Хранить UUID просто в текстовом варианте можно, но это слишком просто. Хотелось бы разобраться что тут не так
  • Вопрос задан
  • 322 просмотра
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Прежде чем пытаться изобрести колесо - проверьте штатные возможности. Если вам ну прямо так очень хочется использовать uuid вместо более компактного и быстрого bigint - то такой тип данных уже есть в postgresql.
Хранится как фиксированной длины поле 16 байт.
Преобразованием его в bytea вы только увеличите, а не уменьшите его размер. Т.к. для bytea потребуется хранить ещё длину данных в этом поле.

С постгресом пока что на Вы и не могу понять что он от меня хочет.. Как я понял из интернетов он плохо воспринимает бинарник в UTF'е

В смысле так и задумано. Если у вас база в utf8, то все текстовые поля намеренно проверяются, чтобы в них было что-то валидное для utf8.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы