程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MYSQL入門知識 >> MYSQL中的UDF 的研究

MYSQL中的UDF 的研究

編輯:MYSQL入門知識
 

mysql中支持UDF擴展 ,使得我們可以調用DLL裡面的函數來實現一些特殊的功能。

但是對於UDF的具體限制,MYSQL的各個版本各有不同。 下面記錄一下:

聽說(只是聽說,沒做測試),在MYSQL 4.1以前的版本中,可以將所有的DLL文件裡面的任何函數都注冊到MYSQL裡面以供MYSQL調用。
無論這個DLL在什麼位置,函數的聲明是什麼樣的。

在MYSQL 4.1及以後的版本中,對UDF函數進行了限制,只有實現了一個特定接口的函數才可以被成功注冊到MYSQL中,
這樣就防止了通過MYSQL非法調用系統的DLL。

在MYSQL5以後,對注冊的DLL的位置有了限制,創建函數的時候,所對應的DLL不能包含/或者\,簡單的理解就是不能是絕對路徑。
所以我們將DLL釋放到system32目錄,來跳過這個限制。。或者放到盤符的根目錄下通過c:udf.dll這種形式的寫法來跳過限制。

經過28ice大牛的提醒,發現原來只要把dll放到PATH這個環境變量所表示的任何一個目錄下面,效果跟放到system32目錄下面一樣。
也可以使用。

再說MYSQL5.1,這裡有個問題相信大家會經常遇到的。。
大家有的時候在創建函數的時候,常常會遇到

這個錯誤。可是我們的語句沒有寫錯,DLL也是免殺的或者服務器上根本沒裝殺軟。。
好多人這裡就不明白了。。

這是因為MYSQL 5.1及以後的版本中,又多了一個限制。
創建函數時所用的DLL只能放在mysql的plugin目錄裡面。。
而且這個plugin目錄默認是不存在的。。挺YD吧,,可能就是為了防止通過into dumpfile將DLL來寫到這個文件夾。。
MYSQL是無法創建目錄的哦, 如果into dumpfile的目標目錄不存在是會報錯的。

需要手動創建 ,但是它卻是一個系統變量。
我在虛擬機上裝了MYSQL 5.1.3進行了測試,安裝目錄是:

通過:

view source
print?
1 show variables like '%plugin%';


可以看到:
+---------------+------------------------------------------------------------------------
| Variable_name | Value
+---------------+-------------------------------------------------------------------------
| plugin_dir | C:\Program Files\MySQL\MySQL Server 5.1\lib/plugin
+---------------+-------------------------------------------------------------------------

plugin目錄位置是mysql安裝目錄下的lib/plugin ,需要我們手動創建 。
然後將udf.dll傳到這個位置,再創建函數 ,這時就會成功了。

但是這個變量的值是只讀的,嘗試用

view source
print?
1 set @@plugin_dir = 'd:\\';


去更改它的值會發生錯誤。

只能通過修改php.ini ,在裡面添加一個

才可以修改這個值 。。
無奈。。
所以在導出UDF提權之前 ,先確定一下MYSQL的版本是有必要的。

如果是5.1以後的,那就不行了,如果是5.1以前的版本創建函數的時候還報Can't open shared library這個錯誤。
那就要看看DLL是不是真的被導出了,還是被殺軟隔離或者干掉了。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved