跳至主要內容

具型別值參考

本頁是 TTOON typed value layer 的詳細參考。如果你只想先快速理解兩種語法與基本規則,請先看 格式總覽

在結構層面上,T-TOON 是建立在 TOON 與其 toon-format 專案 之上的擴充。本頁聚焦的則是 TTOON 在這個基礎上額外加入的 typed value layer 與跨語言語意。

術語

  • typed:值的文字編碼本身直接攜帶型別語意的整體設計概念
  • typed types:12 種內建值編碼
  • typed unit:解析器直接看到的一段單一序列化值,例如 123.45m2026-03-08uuid(...)
  • hexb64 都代表 binary payload,但在文字格式層仍各自算一種 typed type

具型別值系統

兩種語法共用同一組 12 種 typed value 編碼:

型別語法範例備註
null關鍵字nullNull 值
bool關鍵字true, false僅限小寫
int數字,可帶正負號與 _ 分隔符42, -1_000, 0允許正負號與 _
float小數點或科學記號3.14, 1e-9, -0.5, inf, -inf, nan特殊值:inf-infnan
decimalm 後綴的數字123.45m, 0.00m, -99.9m小寫 m;不使用科學記號
string雙引號包覆"Alice", "hello\nworld"一律使用雙引號
dateYYYY-MM-DD2026-03-08在兩種語法中都可裸寫
timeHH:MM:SS[.fractional]14:30:00, 14:30:00.123456最多到微秒
datetimeISO 86012026-03-08T14:30:00, 2026-03-08T14:30:00+08:00, 2026-03-08T14:30:00Z可含時區
uuiduuid(...) 包裝器uuid(550e8400-e29b-41d4-a716-446655440000)僅接受小寫 hex
hexhex(...) 包裝器hex(4A42), hex(48656C6C6F)十六進位 binary 編碼
b64b64(...) 包裝器b64(SkI=), b64(SGVsbG8=)Base64 binary 編碼

為何是這 12 種 typed type

TTOON 的 typed types 並不是照抄某一種資料庫或語言型別系統,而是取主流 RDBMS、Arrow,以及 Python / JS / Rust SDK 之間最實用的交集。

設計目標是讓型別層:

  • 足以覆蓋常見的跨系統資料交換
  • 在 object path 與 Arrow path 都能保持穩定語意
  • 不被單一資料庫私有型別綁死

因此像 jsonbenumintervalarray、地理型別、money 這類型別,暫時不作為內建 typed type,而應交由上層 schema 慣例或自訂 codec 處理。

關鍵規則

  • 字串一定加引號:所有字串都用雙引號 "...",避免 bare token 歧義
  • Decimal 用 m 後綴123.45m 是 exact decimal;123.45 是 float
  • UUID 與 binary 用包裝器uuid(...)hex(...)b64(...)

型別細節

null

null 是單一關鍵字,表示沒有值。

bool

布林值只有 truefalse 兩種形式,而且必須是小寫。

int

整數允許正負號與 _ 數字分隔符:

42
-1_000_000
0

JS 精度注意事項:JS 原生 number 只能安全表示 -(2^53 - 1)2^53 - 1 之間的整數。超出此範圍預設會拋錯。需要時請改用 intBigInt()intNumber({ overflow: 'lossy' })。詳見 JS 編解碼器與 Int64

float

浮點數必須包含小數點或使用科學記號:

3.14
1e-9
-0.5
inf
-inf
nan

decimal

精確十進位使用小寫 m 後綴:

123.45m
0.00m
-99.9m

Decimal 不使用科學記號。123.45m 是 decimal;123.45 是 float。

string

字串一律使用雙引號:

"Alice"
"hello world"
""

escape 規則:

  • T-TOON:只允許 \\\"\n\r\t
  • T-JSON:採完整 JSON escape 集合,包含 \uXXXX\b\f

date

格式為 YYYY-MM-DD,在兩種語法中都可裸寫:

2026-03-08

time

格式為 HH:MM:SS,可帶最多微秒精度的小數秒:

14:30:00
14:30:00.123456

datetime

採 ISO 8601,可選時區:

2026-03-08T14:30:00
2026-03-08T14:30:00+08:00
2026-03-08T14:30:00Z

uuid

UUID 使用 uuid(...)

uuid(550e8400-e29b-41d4-a716-446655440000)

必須符合標準 8-4-4-4-12 形狀,且只接受小寫 hex。

hex / b64

Binary payload 可使用十六進位或 Base64:

hex(48656C6C6F)
b64(SGVsbG8=)

hexb64 在執行期都對應 binary data;差異只存在於文字編碼形式。

跨語言對應(Object Path)

typed typePython loads()JS parse() 預設JS 使用 Codec
nullNonenull
boolboolboolean
intintnumber(不安全時會拋錯)透過 intBigInt() 轉為 bigint
floatfloatnumber
decimaldecimal.Decimalstring(去掉 m透過 codec 轉為 Decimal 類別
stringstrstring
datedatetime.datestring自訂 codec
timedatetime.timestring自訂 codec
datetimedatetime.datetimestring自訂 codec
uuiduuid.UUIDstring自訂 codec
hex/b64bytesUint8Array自訂 codec

為什麼 JS 某些型別預設回傳字串

JS 沒有原生 DecimalUUID、date-only、time-only 型別。預設回傳字串可以避免:

  • 強制依賴第三方套件
  • Browser 與 Node.js 執行期假設分歧

需要更豐富型別時,請用 use() 註冊 codec。詳見 JS 編解碼器與 Int64

Arrow 路徑

typed typePython read_arrow()JS readArrow()Arrow 原生型別
null可為 null 的欄位可為 null 的欄位Null 或可為 null 的 typed column
boolBooleanBoolBoolean
intInt64Int64Int64
floatFloat64Float64Float64
decimalDecimal128/256DecimalDecimal128Decimal256
stringUtf8Utf8Utf8
dateDate32DateDayDate32
timeTime64(Microsecond)TimeMicrosecondTime64(Microsecond)
datetimeTimestamp(μs[, tz])TimestampMicrosecondTimestamp(Microsecond[, tz])
uuidFixedSizeBinary(16)FixedSizeBinary(16)FixedSizeBinary(16) + UUID metadata
hex/b64BinaryBinaryBinary / LargeBinary / FixedSizeBinary

Arrow 型別保留

  • decimal 會用 Decimal128Decimal256,不會降成 Utf8
  • uuid 會用帶 UUID metadata 的 FixedSizeBinary(16),不會降成 Utf8
  • datetime 若有時區會保留時區資訊
  • 全 null 欄位會推論成 Null

Datetime 時區行為

  • 同一欄位不能混用有時區與無時區的 datetime
  • JS Arrow bridge 會強制這條規則,混用時回報 schema inference error
  • 有時區的 datetime 使用 Timestamp(Microsecond, tz)
  • 無時區的 datetime 使用 Timestamp(Microsecond)

讀寫實務建議

  • decimal 通常應保留為 exact numeric 欄位,而不是降成 float
  • uuid 在 PostgreSQL 與 SQL Server 可直接用原生型別;MySQL / SQLite 常用 binary(16) 或字串慣例
  • date / time / datetime 在 SQLite 多半只是應用層慣例,不是強型別保證
  • hexb64 在資料庫層通常都回到同一種 binary 欄位型別

主流 RDBMS 對照

TTOON typed type語意PostgreSQLMySQL / MariaDBSQLiteSQL Server備註
null空值NULLNULLNULLNULL通用
bool布林旗標booleanboolean / tinyint(1)INTEGER 0/1 或 BOOLEAN 別名bitSQLite 無獨立 boolean storage class
int有號整數smallint / integer / biginttinyint / smallint / int / bigintINTEGERsmallint / int / bigintTTOON 不定義 unsigned-only 語意
float近似數值real / double precisionfloat / doubleREALreal / float非精確十進位
decimal精確十進位numeric / decimaldecimal / numeric常見為 NUMERICTEXT 或應用層 decimaldecimal / numericSQLite 無固定精度 decimal storage class
string文字text / varcharchar / varchar / textTEXTnvarchar / varchar / nchar / charTTOON canonical form 為 UTF-8 文字
date日期datedate常見為 TEXT (YYYY-MM-DD)dateSQLite 以慣例為主
time純時間timetime常見為 TEXT (HH:MM:SS[.ffffff])time不含日期
datetime日期時間 / 時間戳timestamp / timestamptzdatetime / timestamp常見為 ISO 8601 TEXT 或 Unix time INTEGERdatetime2 / datetimeoffset若來源型別支援時區則會保留
uuid128-bit 識別值uuid常見為 binary(16)char(36)常見為 TEXTBLOBuniqueidentifierMySQL 與 SQLite 無通用原生 UUID 型別
hexBinary payloadbyteabinary / varbinary / blobBLOBbinary / varbinary文字格式採 hex
b64Binary payloadbyteabinary / varbinary / blobBLOBbinary / varbinary文字格式採 Base64

序列化方向

Python 型別Typed Output
Nonenull
booltrue / false
int42
float3.14
decimal.Decimal123.45m
str"Alice"
datetime.date2026-03-08
datetime.time14:30:00
datetime.datetime2026-03-08T14:30:00
uuid.UUIDuuid(550e8400-...)
byteshex(...)b64(...)
JS 值Typed Output
nullnull
booleantrue / false
number(安全整數)42
number(浮點數)3.14
string"Alice"
bigint(有號 i64 範圍內)42
Date2026-03-08T14:30:00.000Z
Array[1, 2]
plain object{"name": "Alice"}
Uint8Arrayhex(...)b64(...)
toon.decimal('123.45')123.45m
toon.uuid('...')uuid(...)
toon.date('...')2026-03-08
toon.time('14:30:00')14:30:00
toon.datetime('2026-03-08T14:30:00+08:00')2026-03-08T14:30:00+08:00

JS 的 Date 會透過 Date.toISOString() 序列化,因此輸出一律是 UTC,且會帶毫秒精度。

相關頁面