MySQL 之動態字串處理

發表於2016-10-27

MySQL中,常常會看到一些關於動態字串的處理,列如:DYNAMIC_STRING。

為了記錄動態字串的實際長度,緩衝區的最大長度,以及每次字串需要調整時,及時分配新的記憶體,以及調整長度。MySQL使用了DYNAMIC_STRING來儲存動態字串相關的資訊:

在這個結構體中,str儲存實際字串的首地址,length記錄字串的實際長度,max_length記錄字串緩衝區最多可以存放多少字元,alloc_increment表示當字串需要分配記憶體時,每次分配多少記憶體。

下面看看這個結構體的初始化過程:

從上述函式可以看到,初始化時,初始分配的字串緩衝區大小init_alloc會根據需要初始的字串來做判斷。在分配好該DYNAMIC_STRING空間之後,我們會根據緩衝區的大小,字串的實際長度,以及alloc_increment來初始化:

length:字串的實際長度

max_length:緩衝區的最大長度

alloc_increment:空間不夠時,下次分配記憶體的單元大小.

初始化這些內容之後,如果下次需要在該緩衝區新增更多字元,就可以根據這些值來判斷是否需要對該緩衝區擴容:

從上述程式碼可以看到,在字串初始化化好之後,之後如果需要給該字串增加新的內容,只需要根據之前儲存的資訊來動態的realloc就好了。由於該結構體記錄了字串相關的完整內容,所以動態的擴容會非常方便處理。

當然,除了這些,還有比如字串截斷,字串初始設定,轉義OS的引號等等:

將字串偏移大於N之後的截斷。

返回字串中第一次出現某個字元的地址。若沒有,則返回字串結尾的地址(指向’’)

字串內容擴容:

對字串用引號括起來,對其中的單引號進行轉義,主要用於執行一些系統命令(system(cmd))。

比如:ls -al 會變成 ‘ls -al’

比如:ls -a’l會變成’ls -a\’l’

通過定義動態字串的結構體資訊,每次分次進行字串新增更多字元,都會根據字串的當前的長度動態的擴容。而且每次擴容後,該結構體都記錄的當前字串的實際資訊(當前字串的長度,緩衝器可容納字串的長度,進行擴容的單元長度)。這樣,動態字串的處理操作就變得非常方便了。

相關文章