Table des matières
MySQL 之动态字符串处理
Maison développement back-end tutoriel php MySQL 之动态字符串处理_PHP教程

MySQL 之动态字符串处理_PHP教程

Jul 12, 2016 am 09:03 AM
android

MySQL 之动态字符串处理

MySQL中,常常会看到一些关于动态字符串的处理,列如:DYNAMIC_STRING。为了记录动态字符串的实际长度,缓冲区的最大长度,以及每次字符串需要调整时,及时分配新的内存,以及调整长度。MySQL使用了DYNAMIC_STRING来保存动态字符串相关的信息:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>typedef struct st_dynamic_string<br /> </li><li>{<br /></li><li>char *str;<br /></li><li>size_t length,max_length,alloc_increment;<br /></li><li>} DYNAMIC_STRING; </li></ol>
Copier après la connexion
在这个结构体中,str存储实际字符串的首地址,length记录字符串的实际长度,max_length记录字符串缓冲区最多可以存放多少字符,alloc_increment表示当字符串需要分配内存时,每次分配多少内存。

下面看看这个结构体的初始化过程:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>my_bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str,size_t init_alloc, size_t alloc_increment)<br /> </li><li>{<br /></li><li>size_t length;<br /></li><li>DBUG_ENTER("init_dynamic_string");<br /></li><li><br /></li><li>if (!alloc_increment) <br /></li><li>alloc_increment=128;<br /></li><li>length=1;<br /></li><li>if (init_str && (length= strlen(init_str)+1) < init_alloc) <br /></li><li>init_alloc=((length+alloc_increment-1)/alloc_increment)*alloc_increment; <br /></li><li>if (!init_alloc)<br /></li><li>init_alloc=alloc_increment;<br /></li><li><br /></li><li>if (!(str->str=(char*) my_malloc(init_alloc,MYF(MY_WME))))<br /></li><li>DBUG_RETURN(TRUE);<br /></li><li>str->length=length-1;<br /></li><li>if (init_str)<br /></li><li>memcpy(str->str,init_str,length);<br /></li><li>str->max_length=init_alloc;<br /></li><li>str->alloc_increment=alloc_increment;<br /></li><li>DBUG_RETURN(FALSE);<br /></li><li>} </li></ol>
Copier après la connexion
从上述函数可以看到,初始化时,初始分配的字符串缓冲区大小init_alloc会根据需要初始的字符串来做判断。在分配好该DYNAMIC_STRING空间之后,我们会根据缓冲区的大小,字符串的实际长度,以及alloc_increment来初始化:length:字符串的实际长度max_length:缓冲区的最大长度alloc_increment:空间不够时,下次分配内存的单元大小.

初始化这些内容之后,如果下次需要在该缓冲区添加更多字符,就可以根据这些值来判断是否需要对该缓冲区扩容:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>my_bool dynstr_append_mem(DYNAMIC_STRING *str, const char *append,<br /> </li><li>size_t length)<br /></li><li>{<br /></li><li>char *new_ptr;<br /></li><li>if (str->length+length >= str->max_length) //如果新增字符串后,总长度超过缓冲区大小<br /></li><li>{<br /></li><li>//需要分配多少个alloc_increment 大小的内存,才能存下新增后的字符串<br /></li><li>size_t new_length=(str->length+length+str->alloc_increment)/<br /></li><li>str->alloc_increment; <br /></li><li>new_length*=str->alloc_increment;<br /></li><li><br /></li><li>if (!(new_ptr=(char*) my_realloc(str->str,new_length,MYF(MY_WME))))<br /></li><li>return TRUE;<br /></li><li>str->str=new_ptr;<br /></li><li>str->max_length=new_length;<br /></li><li>}<br /></li><li>//将新分配的内容,append到str之后<br /></li><li>memcpy(str->str + str->length,append,length);<br /></li><li>str->length+=length; //扩容之后str新的长度<br /></li><li>str->str[str->length]=0; /* Safety for C programs */ //字符串最后一个字符为’\0'<br /></li><li>return FALSE;<br /></li><li>} </li></ol>
Copier après la connexion
从上述代码可以看到,在字符串初始化化好之后,之后如果需要给该字符串增加新的内容,只需要根据之前存储的信息来动态的realloc就好了。由于该结构体记录了字符串相关的完整内容,所以动态的扩容会非常方便处理。
当然,除了这些,还有比如字符串截断,字符串初始设置,转义OS的引号等等:将字符串偏移大于N之后的截断。

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>my_bool dynstr_trunc(DYNAMIC_STRING *str, size_t n)<br /> </li><li>{<br /></li><li>str->length-=n;<br /></li><li>str->str[str->length]= '\0';<br /></li><li>return FALSE;<br /></li><li>} </li></ol>
Copier après la connexion
返回字符串中第一次出现某个字符的地址。若没有,则返回字符串结尾的地址(指向’\0')

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>char *strcend(register const char *s, register pchar c)<br /> </li><li>{<br /></li><li>for (;;)<br /></li><li>{<br /></li><li>if (*s == (char) c) return (char*) s;<br /></li><li>if (!*s++) return (char*) s-1;<br /></li><li>}<br /></li><li>} </li></ol>
Copier après la connexion
字符串内容扩容:

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>my_bool dynstr_realloc(DYNAMIC_STRING *str, size_t additional_size)<br /> </li><li>{<br /></li><li>DBUG_ENTER("dynstr_realloc");<br /></li><li><br /></li><li>if (!additional_size) DBUG_RETURN(FALSE);<br /></li><li>if (str->length + additional_size > str->max_length) //如果新的字符串内容超过缓冲区的最大长度<br /></li><li>{<br /></li><li>str->max_length=((str->length + additional_size+str->alloc_increment-1)/<br /></li><li>str->alloc_increment)*str->alloc_increment;<br /></li><li>if (!(str->str=(char*) my_realloc(str->str,str->max_length,MYF(MY_WME))))<br /></li><li>DBUG_RETURN(TRUE);<br /></li><li>}<br /></li><li>DBUG_RETURN(FALSE);<br /></li><li>} </li></ol>
Copier après la connexion
对字符串用引号括起来,对其中的单引号进行转义,主要用于执行一些系统命令(system(cmd))。比如:ls -al 会变成 \'ls -al\'比如:ls -a’l会变成\’ls -a\\\’l\'

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>/*<br /> </li><li>Concatenates any number of strings, escapes any OS quote in the result then<br /></li><li>surround the whole affair in another set of quotes which is finally appended<br /></li><li>to specified DYNAMIC_STRING. This function is especially useful when<br /></li><li>building strings to be executed with the system() function.<br /></li><li><br /></li><li>@param str Dynamic String which will have addtional strings appended.<br /></li><li>@param append String to be appended.<br /></li><li>@param ... Optional. Additional string(s) to be appended.<br /></li><li><br /></li><li>@note The final argument in the list must be NullS even if no additional<br /></li><li>options are passed.<br /></li><li><br /></li><li>@return True = Success.<br /></li><li>*/<br /></li><li><br /></li><li>my_bool dynstr_append_os_quoted(DYNAMIC_STRING *str, const char *append, ...)<br /></li><li>{<br /></li><li><br /></li><li>const char *quote_str= "\'";<br /></li><li>const uint quote_len= 1;<br /></li><li>my_bool ret= TRUE;<br /></li><li>va_list dirty_text;<br /></li><li><br /></li><li>ret&= dynstr_append_mem(str, quote_str, quote_len); /* Leading quote */<br /></li><li>va_start(dirty_text, append);<br /></li><li>while (append != NullS)<br /></li><li>{<br /></li><li>const char *cur_pos= append;<br /></li><li>const char *next_pos= cur_pos;<br /></li><li><br /></li><li>/* Search for quote in each string and replace with escaped quote */<br /></li><li>while(*(next_pos= strcend(cur_pos, quote_str[0])) != '\0')<br /></li><li>{<br /></li><li>ret&= dynstr_append_mem(str, cur_pos, (uint) (next_pos - cur_pos));<br /></li><li>ret&= dynstr_append_mem(str ,"\\", 1);<br /></li><li>ret&= dynstr_append_mem(str, quote_str, quote_len);<br /></li><li>cur_pos= next_pos + 1;<br /></li><li>}<br /></li><li>ret&= dynstr_append_mem(str, cur_pos, (uint) (next_pos - cur_pos));<br /></li><li>append= va_arg(dirty_text, char *);<br /></li><li>}<br /></li><li>va_end(dirty_text);<br /></li><li>ret&= dynstr_append_mem(str, quote_str, quote_len); /* Trailing quote */<br /></li><li><br /></li><li>return ret;<br /></li><li>} </li></ol>
Copier après la connexion
通过定义动态字符串的结构体信息,每次分次进行字符串添加更多字符,都会根据字符串的当前的长度动态的扩容。而且每次扩容后,该结构体都记录的当前字符串的实际信息(当前字符串的长度,缓冲器可容纳字符串的长度,进行扩容的单元长度)。这样,动态字符串的处理操作就变得非常方便了。



www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1079090.htmlTechArticleMySQL 之动态字符串处理 MySQL中,常常会看到一些关于动态字符串的处理,列如:DYNAMIC_STRING。为了记录动态字符串的实际长度,缓冲区的最...
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Un nouveau rapport fournit une évaluation accablante des rumeurs de mise à niveau des appareils photo des Samsung Galaxy S25, Galaxy S25 Plus et Galaxy S25 Ultra Un nouveau rapport fournit une évaluation accablante des rumeurs de mise à niveau des appareils photo des Samsung Galaxy S25, Galaxy S25 Plus et Galaxy S25 Ultra Sep 12, 2024 pm 12:23 PM

Ces derniers jours, Ice Universe n'a cessé de révéler des détails sur le Galaxy S25 Ultra, qui est largement considéré comme le prochain smartphone phare de Samsung. Entre autres choses, le fuyard a affirmé que Samsung prévoyait d'apporter une seule mise à niveau de l'appareil photo.

Le Samsung Galaxy S25 Ultra fuit dans les premières images de rendu avec des rumeurs de modifications de conception révélées Le Samsung Galaxy S25 Ultra fuit dans les premières images de rendu avec des rumeurs de modifications de conception révélées Sep 11, 2024 am 06:37 AM

OnLeaks s'est désormais associé à Android Headlines pour offrir un premier aperçu du Galaxy S25 Ultra, quelques jours après une tentative infructueuse de générer plus de 4 000 $ auprès de ses abonnés X (anciennement Twitter). Pour le contexte, les images de rendu intégrées ci-dessous h

IFA2024 | Le NXTPAPER 14 de TCL n'égalera pas la Galaxy Tab S10 Ultra en termes de performances, mais il lui correspond presque en taille IFA2024 | Le NXTPAPER 14 de TCL n'égalera pas la Galaxy Tab S10 Ultra en termes de performances, mais il lui correspond presque en taille Sep 07, 2024 am 06:35 AM

En plus d'annoncer deux nouveaux smartphones, TCL a également annoncé une nouvelle tablette Android appelée NXTPAPER 14, et sa taille d'écran massive est l'un de ses arguments de vente. Le NXTPAPER 14 est doté de la version 3.0 de la marque emblématique de panneaux LCD mats de TCL.

Vivo Y300 Pro contient une batterie de 6 500 mAh dans un boîtier mince de 7,69 mm Vivo Y300 Pro contient une batterie de 6 500 mAh dans un boîtier mince de 7,69 mm Sep 07, 2024 am 06:39 AM

Le Vivo Y300 Pro vient d'être entièrement dévoilé et c'est l'un des téléphones Android de milieu de gamme les plus fins avec une grande batterie. Pour être exact, le smartphone ne fait que 7,69 mm d'épaisseur mais dispose d'une batterie de 6 500 mAh. C'est la même capacité que le lancement récent

Le Samsung Galaxy S24 FE est annoncé pour un lancement moins cher que prévu en quatre couleurs et deux options de mémoire Le Samsung Galaxy S24 FE est annoncé pour un lancement moins cher que prévu en quatre couleurs et deux options de mémoire Sep 12, 2024 pm 09:21 PM

Samsung n'a pas encore donné d'indications sur la date à laquelle il mettrait à jour sa série de smartphones Fan Edition (FE). Dans l’état actuel des choses, le Galaxy S23 FE reste l’édition la plus récente de la société, ayant été présentée début octobre 2023. Cependant, de nombreux

Un nouveau rapport fournit une évaluation accablante des rumeurs de mise à niveau des appareils photo des Samsung Galaxy S25, Galaxy S25 Plus et Galaxy S25 Ultra Un nouveau rapport fournit une évaluation accablante des rumeurs de mise à niveau des appareils photo des Samsung Galaxy S25, Galaxy S25 Plus et Galaxy S25 Ultra Sep 12, 2024 pm 12:22 PM

Ces derniers jours, Ice Universe n'a cessé de révéler des détails sur le Galaxy S25 Ultra, qui est largement considéré comme le prochain smartphone phare de Samsung. Entre autres choses, le fuyard a affirmé que Samsung prévoyait d'apporter une seule mise à niveau de l'appareil photo.

Xiaomi Redmi Note 14 Pro Plus arrive en tant que premier smartphone Qualcomm Snapdragon 7s Gen 3 avec caméra Light Hunter 800 Xiaomi Redmi Note 14 Pro Plus arrive en tant que premier smartphone Qualcomm Snapdragon 7s Gen 3 avec caméra Light Hunter 800 Sep 27, 2024 am 06:23 AM

Le Redmi Note 14 Pro Plus est désormais officiel en tant que successeur direct du Redmi Note 13 Pro Plus de l'année dernière (375 $ sur Amazon). Comme prévu, le Redmi Note 14 Pro Plus est en tête de la série Redmi Note 14 aux côtés du Redmi Note 14 et du Redmi Note 14 Pro. Li

iQOO Z9 Turbo Plus : les réservations commencent pour le produit phare de la série potentiellement renforcée iQOO Z9 Turbo Plus : les réservations commencent pour le produit phare de la série potentiellement renforcée Sep 10, 2024 am 06:45 AM

La marque sœur de OnePlus, iQOO, a un cycle de produits 2023-4 qui pourrait être presque terminé ; néanmoins, la marque a déclaré qu'elle n'en avait pas encore fini avec sa série Z9. Sa variante Turbo+ finale, et peut-être la plus haut de gamme, vient d'être annoncée comme prévu. T

See all articles