| 維度 | UDF (使用者定義函數) | 內建函數 (Native) |
|---|---|---|
| 部署 | 編譯為 .so/.dll,CREATE FUNCTION 動態載入 | 編譯進 mysqld,隨伺服器啟動永久可用 |
| 升級維護 | 版本升級通常相容 (介面未變) | 每次升級需重新打補丁編譯 |
| 發布限制 | 可釋放二進制插件 | 需修改原始碼發布 |
| 效能 | 函數呼叫開銷略高 | 零開銷,內聯優化可能 |
| 安全性 | 受 plugin_dir、--allow-suspicious-udfs 限制 | 核心代碼級信任 |
// 必須實作的入口函數
my_bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
void xxx_deinit(UDF_INIT *initid);
xxx(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
// 聚合函數額外需實作
void xxx_clear(UDF_INIT *initid, char *is_null, char *error);
void xxx_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
UDF_INIT:maybe_null、decimals、max_length、ptr (用戶自定義記憶體)。UDF_ARGS:arg_count、arg_type[]、args[][]、lengths[]。sql/udf_example.cc 撰寫 myfunc.cc。gcc -shared -o myfunc.so myfunc.cc -I/usr/include/mysql -fPICcp myfunc.so $(mysql_config --plugindir)/CREATE FUNCTION myfunc RETURNS INTEGER SONAME 'myfunc.so';SELECT myfunc(1,2);DROP FUNCTION myfunc;plugin_dir 唯一載入路徑,防止任意路徑載入。--allow-suspicious-udfs=OFF (預設) 僅允許含輔助符號 (_init/_deinit) 的庫載入。CREATE FUNCTION ... RETURN ...。UDF 是 MySQL 擴展性的「核選項」:威力大、風險高、維護重。標準化決策流程:需求分析 → 預存函數可行性評估 → UDF 設計 → 完整測試矩陣 → 灰度發布 → 監控告警,任何捷徑都可能釀成生產事故。