如何使用 Postgres 縮短 UUID?
我看到許多 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 的相同文本表示。
創建表和製作查詢時,使用
uuid
datatype。在文件頁面上,您將找到預設允許的輸入字元串格式的範例。值得注意的評論是……PostgreSQL 也接受以下替代形式的輸入:使用大寫數字,用大括號括起來的標準格式,省略部分或全部連字元,在任何四位數字組後添加連字元。例子是:
但
輸出始終為標準格式。
如果您真的非常希望您的數據庫執行 base64 編碼您的 uuid 的繁瑣工作,您可以使用這些函式
encode
,uuid_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)。不確定那裡是否發生了更聰明的事情,或者我錯過了關於轉換協議的一些內容,僅供參考¯_(ツ)_/¯