本頁說明如何使用 Spanner 處理 JSON。
JSON 資料類型是一種半結構化資料類型,用於保存 JSON (JavaScript 物件表示法) 資料。JSON 格式的規格請參閱 RFC 7159。
對於稀疏資料,或結構定義寬鬆或會變更的資料,JSON 可用來補充關聯式結構定義。不過,查詢最佳化工具會依據關聯式模型,大規模有效率地篩選、聯結、彙整及排序。透過 JSON 進行查詢時,內建最佳化功能較少,可檢查及調整效能的輔助功能也較少。
規格
Spanner JSON 類型會儲存輸入 JSON 文件的正規化表示法。
- JSON 最多可巢狀結構化 80 層。
- 系統不會保留空白字元。
- 不支援留言。如果交易或查詢包含註解,就會失敗。
- JSON 物件的成員會依字典順序排序。
- JSON 陣列元素會保留順序。
- 如果 JSON 物件有重複的鍵,系統只會保留第一個。
- 原始型別 (字串、布林值、數字和空值) 會保留型別和值。
- 系統會完全保留字串類型的值。
- 系統會保留數字類型的值,但可能會因正規化程序而變更文字表示法。舉例來說,輸入數字 10000 的正規化表示法可能是 1e+4。數值保留語意如下:
- 系統會保留範圍在 [INT64_MIN, INT64_MAX] 的帶正負號整數。
- 系統會保留 [0, UINT64_MAX] 範圍內的無符號整數。
- 系統會保留可從字串來回轉換為雙精度浮點數,再轉換為字串,且不會失去精確度的雙精度浮點數值。如果雙精度浮點值無法以這種方式來回傳輸,交易或查詢就會失敗。
- 舉例來說,
SELECT JSON '2.2412421353246235436'
會失敗。 - 可行的解決方法是使用
PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round')
,這會傳回JSON '2.2412421353246237'
。
- 舉例來說,
- 使用
TO_JSON()
、JSON_OBJECT()
和JSON_ARRAY()
函式,在 SQL 中建構 JSON 文件。這些函式會實作必要的引號和逸出字元。
標準化文件的大小上限為 10 MB。
是否可以為空值
JSON null
值會視為 SQL 非空值。
例如:
SELECT (JSON '{"a":null}').a IS NULL; -- Returns FALSE
SELECT (JSON '{"a":null}').b IS NULL; -- Returns TRUE
SELECT JSON_QUERY(JSON '{"a":null}', "$.a"); -- Returns a JSON 'null'
SELECT JSON_QUERY(JSON '{"a":null}', "$.b"); -- Returns a SQL NULL
編碼
JSON 文件必須採用 UTF-8 編碼。如果交易或查詢的 JSON 文件採用其他格式編碼,系統會傳回錯誤。
建立含有 JSON 資料欄的資料表
建立資料表時,可以將 JSON 資料欄新增至資料表。JSON 類型值可為可為空值。
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
VenueFeatures JSON,
DateOpened DATE,
) PRIMARY KEY(VenueId);
在現有資料表中新增及移除 JSON 欄
您也可以在現有資料表中新增及捨棄 JSON 欄。
ALTER TABLE Venues ADD COLUMN VenueDetails JSON;
ALTER TABLE Venues DROP COLUMN VenueDetails;
以下範例顯示如何使用 Spanner 用戶端程式庫,將名為 VenueDetails
的 JSON
資料欄新增至 Venues
資料表。
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
修改 JSON 資料
以下範例顯示如何使用 Spanner 用戶端程式庫更新 JSON
資料。
C++
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
C#
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Go
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Java
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Node.js
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
PHP
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Python
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Ruby
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
為 JSON 資料建立索引
您可以搭配使用次要索引和搜尋索引與 JSON 資料,加快查詢 JSON 資料的速度。Spanner 不支援將 JSON 類型資料欄做為次要索引中的鍵。
使用次要索引
如果想根據 JSON 文件中的純量值進行篩選,次要索引就非常實用。如要在 JSON 中使用次要索引,請建立產生資料欄,擷取相關純量資料,並將資料轉換為適當的 SQL 類型。然後,您可以在這個產生的資料欄上建立次要索引。索引會加快對所產生資料欄執行的合格查詢。
在下列範例中,您會建立 VenuesByCapacity
索引,資料庫會使用該索引尋找容量大於 1000 的場地。Spanner 會使用索引找出相關資料列,而非檢查每個資料列,因此可提升查詢效能,尤其是大型資料表。
ALTER TABLE Venues
ADD COLUMN VenueCapacity INT64 AS (INT64(VenueDetails.capacity));
CREATE INDEX VenuesByCapacity ON Venue (VenueCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
使用搜尋索引
當您查詢動態或多樣的 JSON 文件時,搜尋索引就很有用。與次要索引不同,您可以針對儲存在 JSON 欄中的任何 JSON 文件建立搜尋索引。搜尋索引會自動適應 JSON 文件、不同資料列之間和一段時間內的變化。
在下列範例中,您會建立 VenuesByVenueDetails
搜尋索引,資料庫會使用該索引尋找具有特定詳細資料 (例如大小和營業時間) 的場地。Spanner 不會檢查每個資料列,而是使用索引找出相關資料列,藉此提升查詢效能,尤其是大型資料表。
ALTER TABLE Venues
ADD COLUMN VenueDetails_Tokens TOKENLIST AS (TOKENIZE_JSON(VenueDetails)) HIDDEN;
CREATE SEARCH INDEX VenuesByVenueDetails
ON Venue (VenueDetails_Tokens);
SELECT VenueName
FROM Venues
WHERE JSON_CONTAINS(VenueDetails, JSON '{"labels": ["large"], "open": {"Friday": true}}');
詳情請參閱「JSON 搜尋索引」。
查詢 JSON 資料
以下範例顯示如何使用 Spanner 用戶端程式庫查詢 JSON
資料。
C++
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
C#
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Go
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Java
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Node.js
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
PHP
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Python
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Ruby
如要瞭解如何安裝及使用 Spanner 的用戶端程式庫,請參閱這篇文章。
如要向 Spanner 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
限制
- 您無法在
ORDER BY
子句中使用 JSON 資料欄。 - 您無法使用 JSON 類型資料欄做為主鍵,或做為次要索引中的鍵。詳情請參閱「為 JSON 資料建立索引」。