Postgresql

如何使用 Postgres 縮短 UUID?

  • February 15, 2022

我看到許多 Web 服務(想到 Stripe)對其 UUID 使用特殊編碼。他們將使用特殊的字母(通常是小寫、大寫字母和數字)而不是通常的編碼a44521d0-0fb8-4ade-8002-3385545c3318進行編碼,這會導致 UUID 類似於mhvXdrZT4jP5T8vBxuvm75. 兩者都表示相同的 UUID,但編碼不同。

我想知道這些服務如何處理這些 ID?特別是 Postgres 是否可以在數據庫中直接使用這種短 ID 編碼?(換句話說,任何選擇或插入都將使用短 ID)

或者將這些短 ID 直接保存為數據庫中的文本是否有意義?

我找不到太多關於此的資訊,所以我不確定這裡的最佳做法是什麼。

UUID 實際上是 16 字節長的二進製字元串,您通常希望這樣儲存和操作它們。只有當通過無法處理二進製字元串的協議(例如 HTTP 查詢)傳遞 UUID 時,您才需要將它們序列化為字元串。您在問題中所指的兩種常用方法是十六進製表示 ( a44521d0-0fb8-4ade-8002-3385545c3318) 和 base-64 編碼 ( mhvXdrZT4jP5T8vBxuvm75)。選擇您喜歡的並且與上游和下游應用程序兼容的。

您從客戶端(例如 psql 或 pgAdmin)傳遞給數據庫的文本不是uuid。它只是 uuid 的文本表示。同樣,數據庫發回給您的文本也不是 uuid - 是 uuid 的相同文本表示。

創建表和製作查詢時,使用uuiddatatype。在文件頁面上,您將找到預設允許的輸入字元串格式的範例。值得注意的評論是……

PostgreSQL 也接受以下替代形式的輸入:使用大寫數字,用大括號括起來的標準格式,省略部分或全部連字元,在任何四位數字組後添加連字元。例子是:

輸出始終為標準格式。

如果您真的非常希望您的數據庫執行 base64 編碼您的 uuid 的繁瑣工作,您可以使用這些函式encodeuuid_send如此處所示

select encode(uuid_send('a44521d0-0fb8-4ade-8002-3385545c3318'::uuid),'base64');

請注意,這不會更改 uuid 本身,因此您仍然應該將 uuid 儲存為文本(或 bytea,或任何“聰明”的東西)。將您的 uuid 儲存為 uuid。在應用層做有趣的字元串轉換。

另請注意,OP 中給出的範例 uuid(經典形式)似乎與給出的範例 base64 字元串不對應(僅使用https://www.fileformat.info/tool/guid-base64.htm)。不確定那裡是否發生了更聰明的事情,或者我錯過了關於轉換協議的一些內容,僅供參考¯_(ツ)_/¯

引用自:https://dba.stackexchange.com/questions/307520