MySQL提供兩種機制擴展SQL函數功能,各有優劣,選擇取決於部署環境、維護策略、效能需求。
.so、Windows .dll)CREATE FUNCTION動態載入至運行中服務器DROP FUNCTION可動態卸載,無需重啟服務plugin_dir)plugin_dir目錄權限緩解)sql/item_func.cc等)mysqld編譯連結,永久內建於服務器二進位檔mysqld二進位檔)CREATE FUNCTION ... RETURNS ... BEGIN ... END)// 初始化函數
my_bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
// 主運算函數
long long xxx(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
// 反初始化函數
void xxx_deinit(UDF_INIT *initid);
# Linux範例
gcc -shared -o udf_example.so udf_example.cc -I/usr/include/mysql -fPIC
cp udf_example.so /usr/lib/mysql/plugin/ # 或 plugin_dir 指定路徑
# MySQL內註冊
CREATE FUNCTION my_func RETURNS INTEGER SONAME 'udf_example.so';
plugin_dir載入UDF(防止任意路徑載入)INSERT權限於mysql.func表才能註冊CREATE ROUTINE、EXECUTE控制MySQL原始碼套件sql/udf_example.cc提供完整範例,展示字串處理、數值運算、錯誤處理等常見模式。
| 場景 | 推薦方案 |
|---|---|
| 第三方二進位部署、需快速迭代、跨版本相容 | UDF |
| 核心功能擴展、極致效能、官方發布版整合 | 內建函數 |
| 業務邏輯封裝、團隊缺C/C++能力、維護性優先 | 預存函數 |