本文介紹AnalyticDB for MySQL支援哪些資料類型,與MySQL資料類型的差異對比以及隱式轉換規則。
AnalyticDB for MySQL支援的基礎資料類型
類型 | 資料類型 | 說明 | 與MySQL資料類型差異 |
數實值型別 |
| 值只能是
| 一致。 |
| 取值範圍 | 一致。 | |
| 取值範圍 | 一致。 | |
| 取值範圍 | AnalyticDB for MySQL中的 | |
| 取值範圍 | 一致。 | |
| 取值範圍 | 一致。 | |
| 取值範圍 | 一致。 | |
|
|
| |
字元類型 |
| 儲存位元組數最大為16MB,使用時無需指定儲存長度。 說明 若您指定儲存長度VARCHAR(255),括弧中的數字僅用於文法相容,實際可以儲存超過255個字元,由資料本身決定(最大16MB)。請勿依賴該參數進行長度校正。 | AnalyticDB for MySQL中的 |
| 儲存字元長度。 | AnalyticDB for MySQL中的 | |
時間類型 |
| 取值範圍 |
|
| 取值範圍 |
| |
| 取值範圍 重要
|
| |
| 時間戳記類型,取值範圍 說明
|
| |
空間類型 |
| 地理座標,由座標經度x和緯度y組成。 | 一致。 |
隱式類型轉換
隱式類型轉換是指在執行SQL查詢操作時,由AnalyticDB for MySQL依據上下文使用環境及類型轉換規則自動進行的類型轉換。
投影轉換規則
SELECT語句中的列與常量比較,傳回型別會被隱式轉換為表格中的資料類型。如果存在不支援隱式轉換的情境,會提示不支援此類轉換報錯。
列/常量 | VARCHAR | BOOLEAN | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | TIME | DATE | TIMESTAMP | DATETIME |
VARCHAR | VARCHAR | BOOLEAN | BIGINT | BIGINT | BIGINT | BIGINT | DECIMAL | DOUBLE | TIME | DATE | TIMESTAMP | DATETIME |
BOOLEAN | BOOLEAN | BOOLEAN | TINYINT | SMALLINT | INTEGER | BIGINT | 不支援 | DOUBLE | 不支援 | 不支援 | 不支援 | 不支援 |
TINYINT | BIGINT | TINYINT | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | 不支援 | 不支援 | 不支援 | 不支援 |
SMALLINT | BIGINT | SMALLINT | SMALLINT | SMALLINT | INTEGER | BIGINT | DECIMAL | DOUBLE | 不支援 | 不支援 | 不支援 | 不支援 |
INTEGER | BIGINT | INTEGER | INTEGER | INTEGER | INTEGER | BIGINT | DECIMAL | DOUBLE | BIGINT | BIGINT | BIGINT | BIGINT |
BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | DECIMAL | DOUBLE | BIGINT | BIGINT | BIGINT | BIGINT |
DECIMAL | DECIMAL | 不支援 | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DECIMAL | DOUBLE | 不支援 | 不支援 | 不支援 | 不支援 |
DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE |
TIME | TIME | 不支援 | 不支援 | 不支援 | BIGINT | BIGINT | 不支援 | DOUBLE | TIME | BIGINT | BIGINT | DATETIME |
DATE | DATE | 不支援 | 不支援 | 不支援 | BIGINT | BIGINT | 不支援 | DOUBLE | BIGINT | TIMESTAMP | TIMESTAMP | DATETIME |
TIMESTAMP | TIMESTAMP | 不支援 | 不支援 | 不支援 | BIGINT | BIGINT | 不支援 | DOUBLE | BIGINT | TIMESTAMP | TIMESTAMP | DATETIME |
DATETIME | DATETIME | 不支援 | 不支援 | 不支援 | BIGINT | BIGINT | 不支援 | DOUBLE | DATETIME | DATETIME | DATETIME | DATETIME |
過濾轉換規則
WHERE子句中的列與常量比較,傳回型別會被隱式轉換為表格中的資料類型。如果存在不支援隱式轉換的情境,會提示不支援此類轉換報錯。
比較類型不一致,隱式類型轉換時可能會出現無法下推的情況,觸發全表掃描操作,顯著降低查詢效能。其中,下推是指過濾條件下推到儲存層,通過索引匹配過濾,在過濾度高的時候減少資料掃描,從而提升查詢效能。
下表中,返回資料類型前的1代表可以下推,0代表不能下推。
列/常量 | VARCHAR | BOOLEAN | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | REAL | DOUBLE | TIME | DATE | TIMESTAMP | DATETIME |
VARCHAR | 1 VARCHAR | 0 BOOLEAN | 0 BIGINT | 0 BIGINT | 0 BIGINT | 0 BIGINT | 0 DECIMAL | 0 REAL | 0 DOUBLE | 0 TIME | 0 DATE | 0 TIMESTAMP | 0 DATETIME |
BOOLEAN | 1 BOOLEAN | 1 BOOLEAN | 0 TINYINT | 0 SMALLINT | 0 INTEGER | 0 BIGINT | 不支援 | 0 REAL | 0 DOUBLE | 不支援 | 不支援 | 不支援 | 不支援 |
TINYINT | 1 TINYINT | 1 TINYINT | 1 TINYINT | 1 TINYINT | 1 TINYINT | 1 TINYINT | 0 DECIMAL | 0 REAL | 0 DOUBLE | 不支援 | 不支援 | 不支援 | 不支援 |
SMALLINT | 1 SMALLINT | 1 SMALLINT | 1 SMALLINT | 1 SMALLINT | 1 SMALLINT | 1 SMALLINT | 0 DECIMAL | 0 REAL | 0 DOUBLE | 不支援 | 不支援 | 不支援 | 不支援 |
INTEGER | 1 INTEGER | 1 INTEGER | 1 INTEGER | 1 INTEGER | 1 INTEGER | 1 INTEGER | 0 DECIMAL | 0 REAL | 0 DOUBLE | 1 INTEGER | 1 INTEGER | INTEGER | INTEGER |
BIGINT | 1 BIGINT | 1 BIGINT | 1 BIGINT | 1 BIGINT | 1 BIGINT | 1 BIGINT | 0 DECIMAL | 0 REAL | 0 DOUBLE | 1 BIGINT | 1 BIGINT | BIGINT | BIGINT |
DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 1 DECIMAL | 0 REAL | 0 DOUBLE | 不支援 | 不支援 | 不支援 | 不支援 |
REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 1 REAL | 0 DOUBLE | 不支援 | 不支援 | 不支援 | 不支援 |
DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE | 1 DOUBLE |
TIME | 1 TIME | 不支援 | 不支援 | 不支援 | 0 BIGINT | 0 BIGINT | 不支援 | 不支援 | 0 DOUBLE | 1 TIME | 0 BIGINT | 0 BIGINT | 0 DATETIME |
DATE | 1 DATE | 不支援 | 不支援 | 不支援 | 0 BIGINT | 0 BIGINT | 不支援 | 不支援 | 0 DOUBLE | 0 BIGINT | 1 DATE | 0 TIMESTAMP | 0 DATETIME |
TIMESTAMP | 1 TIMESTAMP | 不支援 | 不支援 | 不支援 | 0 BIGINT | 0 BIGINT | 不支援 | 不支援 | 0 DOUBLE | 1 TIMESTAMP | 1 TIMESTAMP | 1 TIMESTAMP | 1 TIMESTAMP |
DATETIME | 1 DATETIME | 不支援 | 不支援 | 不支援 | 0 BIGINT | 0 BIGINT | 不支援 | 不支援 | 0 DOUBLE | 1 DATETIME | 1 DATETIME | 1 DATETIME | 1 DATETIME |
強制類型轉換最佳化(ENFORCE_UNWRAP_CAST)
強制類型轉換最佳化是資料庫系統中用於控制類型轉換策略的最佳化機制,旨在解決因隱式類型轉換導致的查詢效能下降和結果準確性問題。
配置方式
強制類型轉換最佳化支援兩種配置方式,可根據業務需求靈活選擇。
全域配置
通過設定全域參數開啟最佳化,適用於所有查詢。
SET ADB_CONFIG ENFORCE_UNWRAP_CAST = true;通過Hint方式配置
針對特定查詢臨時啟用最佳化,不影響其他查詢。
/*+ ENFORCE_UNWRAP_CAST=true */
樣本
假設test表中col列為VARCHAR類型,該列包含值'1'、'1a'、'abc'。執行如下查詢語句:
SELECT col FROM test WHERE col = 1;根據enforce_unwrap_cast配置狀態不同,需特別注意結果變化:
預設關閉狀態(
ENFORCE_UNWRAP_CAST=false):系統將VARCHAR列隱式轉換為BIGINT類型進行比較。此時'1'和'1a'均會被截斷,非數字部分轉換為數值1參與比較,最終返回兩個匹配結果'1'和'1a'。由於該隱式轉換髮生在列值層面,導致無法觸發下推最佳化,系統需要掃描全表。此時,查詢效能會降低。開啟狀態(
ENFORCE_UNWRAP_CAST=true):系統將INTEGER常量轉換為VARCHAR類型進行字串比較。此時只有'1'能與常量1完全符合,'1a'因字串不匹配而被過濾,最終僅返回一個匹配結果'1'。這種最佳化策略可將比較邏輯下推至儲存層,有效減少資料掃描量,提升查詢效能。