{"id":418,"date":"2011-12-05T08:00:14","date_gmt":"2011-12-05T13:00:14","guid":{"rendered":"http:\/\/www.latindevelopers.com\/ivancp\/?p=418"},"modified":"2011-12-08T10:37:15","modified_gmt":"2011-12-08T15:37:15","slug":"probando-udf-para-mysql-title-case","status":"publish","type":"post","link":"https:\/\/www.latindevelopers.com\/ivancp\/2011\/12\/probando-udf-para-mysql-title-case\/","title":{"rendered":"Probando UDFs para MySQL: Title Case"},"content":{"rendered":"<p><a href=\"http:\/\/www.latindevelopers.com\/ivancp\/wp-content\/uploads\/logo-mysql-170x115-e1302270861102.png\"><img data-attachment-id=\"249\" data-permalink=\"https:\/\/www.latindevelopers.com\/ivancp\/2011\/04\/show-table-status-mejorado\/logo-mysql-170x115\/\" data-orig-file=\"https:\/\/www.latindevelopers.com\/ivancp\/wp-content\/uploads\/logo-mysql-170x115-e1302270861102.png\" data-orig-size=\"100,67\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"Logo mysql\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/www.latindevelopers.com\/ivancp\/wp-content\/uploads\/logo-mysql-170x115-e1302270861102.png\" data-large-file=\"https:\/\/www.latindevelopers.com\/ivancp\/wp-content\/uploads\/logo-mysql-170x115-e1302270861102.png\" loading=\"lazy\" class=\"alignright size-full wp-image-249\" title=\"Logo mysql\" src=\"http:\/\/www.latindevelopers.com\/ivancp\/wp-content\/uploads\/logo-mysql-170x115-e1302270861102.png\" alt=\"\" width=\"100\" height=\"67\" \/><\/a>Conocemos \u00abde sobra\u00bb lo que hacen las funciones <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.0\/en\/string-functions.html#function_lcase\" target=\"_blank\"> LCASE<\/a> y <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.0\/en\/string-functions.html#function_ucase\" target=\"_blank\">UCASE<\/a> en MySQL, otros gestores tambi\u00e9n la implementan con alguna variaci\u00f3n en el nombre pero con el mismo resultado.<\/p>\n<p>Pero que pasa si queremos una funci\u00f3n que convierta un texto al tipo Titulo, conocido tambi\u00e9n como <em>title case<\/em>, es decir convertir \u00ab<span style=\"color: #339966;\">un texto arbitrario<\/span>\u00bb en \u00ab<span style=\"color: #339966;\">Un Texto Arbitrario<\/span>\u00ab, para este caso no existe la funci\u00f3n m\u00e1gica que haga esa conversi\u00f3n y tenemos que escribir una propia.<\/p>\n<p>No es necesario \u00abreinventar la rueda\u00bb (aunque podr\u00eda hacerlo), buscando encontr\u00e9 un repositorio de <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.0\/es\/adding-functions.html\" target=\"_blank\">funciones UDF<\/a> para MySQL: <a href=\"http:\/\/www.mysqludf.org\/\" target=\"_blank\">http:\/\/www.mysqludf.org\/ <\/a>, hay varias funciones agrupadas seg\u00fan el objetivo\/funcionalidad, solo tienen que descargar el c\u00f3digo fuente, compilarlo y agregarlo como funciones nuevas en vuestros servidores MySQL.<\/p>\n<p>He aislado la funci\u00f3n <a href=\"http:\/\/www.mysqludf.org\/lib_mysqludf_str\/#str_ucwords\" target=\"_blank\">str_ucwords<\/a>  (que convierte un texto a \u00abTitle Case\u00bb) en un archivo separado para mostrarles como es que podemos compilar una UDF  para MySQL.Pero <strong>he modificado<\/strong> el archivo por que solo funcionaba con par\u00e1metros constantes, ahora la funci\u00f3n acepta nombres de columnas como par\u00e1metros.<\/p>\n<p>Pueden descargar el archivo fuente: <a href=\"http:\/\/www.latindevelopers.com\/ivancp\/wp-content\/uploads\/ucwords.c\">ucwords.c<\/a><\/p>\n<p>Para compilarlo necesitan unas tres instrucciones:<\/p>\n<pre lang=\"bash\">#Compilamos el programa\r\nivancp@ubuntu$ gcc ucwords.c -o ucwords.so -shared -lmysqlclient -I\/usr\/include\/mysql\r\n\r\n#Copiamos el archivo de salida en la carpeta de plugins de mysql\r\nivancp@ubuntu$ sudo cp ucwords.so \/usr\/lib\/mysql\/plugin\r\n\r\n#Quitamos el permiso de ejecuci\u00f3n del archivo\r\n#para que pueda cargarlo correctamente\r\nivancp@ubuntu$ sudo chmod -x  \/usr\/lib\/mysql\/plugin\/ucwords.so<\/pre>\n<p>&nbsp;<\/p>\n<ul>\n<li>La opci\u00f3n -shared compila el archivo para que pueda ser usado como librer\u00eda.<\/li>\n<li>La descripci\u00f3n del resto de par\u00e1metros van a encontrarla en la entrada: <a title=\"Leer datos MySQL desde C++ sobre Linux\" href=\"http:\/\/www.latindevelopers.com\/ivancp\/2006\/02\/mysql-desde-cpp\/\" target=\"_blank\">Leer datos de MySQL desde C<\/a><\/li>\n<\/ul>\n<p>Ahora debemos agregar la funci\u00f3n  a MySQL:<\/p>\n<pre lang=\"mysql\">mysql> create function str_ucwords returns string soname 'ucwords.so';\r\nQuery OK, 0 rows affected (0.00 sec)\r\n\r\nmysql><\/pre>\n<p>&nbsp;<\/p>\n<p>Ahora veamos algunas pruebas, esta es una consulta com\u00fan (los datos est\u00e1n almacenados en may\u00fasculas o Upper Case):<\/p>\n<pre lang=\"mysql\">mysql>select nombres from tabla;\r\n+----------------------------------+\r\n| nombres                          |\r\n+----------------------------------+\r\n| AGUILAR PALACIOS RICARDO         |\r\n| ANDIA MARQUEZ LUIS MELITON       |\r\n| CUYUBAMBA RAMOS VICTOR ALEJANDRO |\r\n| FELICIANO VELAZCO VICTORIA       |\r\n| FLORIDA EVANGELISTA LILA REYNA   |\r\n| LEON LAULATE FERNANDO            |\r\n| PALACIOS LOPEZ ROXANA BEATRIZ    |\r\n| REATEGUI RAMIREZ CARLOS          |\r\n| REINOSO MORI JORGE WILLY         |\r\n| SALAZAR VALDIVIA WALTER          |\r\n| SANCHEZ TUTUSIMA CARMEN ROSA     |\r\n| VELAZCO BERROA PETRONA           |\r\n+----------------------------------+\r\n12 rows in set (0.00 sec)<\/pre>\n<p>&nbsp;<\/p>\n<p>Aqu\u00ed esta lo que queremos ver, la consulta primero convierte a min\u00fasculas todo el campo y luego convierte \u00e9ste resultado a Title Case, vean:<\/p>\n<pre lang=\"mysql\">mysql>select str_ucwords(lcase(nombres)) from tabla;\r\n+----------------------------------+\r\n| str_ucwords(lcase(nombres))      |\r\n+----------------------------------+\r\n| Aguilar Palacios Ricardo         |\r\n| Andia Marquez Luis Meliton       |\r\n| Cuyubamba Ramos Victor Alejandro |\r\n| Feliciano Velazco Victoria       |\r\n| Florida Evangelista Lila Reyna   |\r\n| Leon Laulate Fernando            |\r\n| Palacios Lopez Roxana Beatriz    |\r\n| Reategui Ramirez Carlos          |\r\n| Reinoso Mori Jorge Willy         |\r\n| Salazar Valdivia Walter          |\r\n| Sanchez Tutusima Carmen Rosa     |\r\n| Velazco Berroa Petrona           |\r\n+----------------------------------+\r\n12 rows in set (0.00 sec)<\/pre>\n<p>&nbsp;<\/p>\n<p>Funciona a la perfecci\u00f3n!<\/p>\n<p>Por favor revisen la documentaci\u00f3n, en otro post explicar\u00e9 que deben tener en cuenta para elaborar sus propios UDF:<\/p>\n<p><a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.0\/en\/adding-udf.html\" target=\"_blank\">http:\/\/dev.mysql.com\/doc\/refman\/5.0\/en\/adding-udf.html<\/a><\/p>\n<div class=\"sharedaddy sd-sharing-enabled\"><div class=\"robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing\"><h3 class=\"sd-title\">Compartelo:<\/h3><div class=\"sd-content\"><ul><li class=\"share-facebook\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-facebook-418\" class=\"share-facebook sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2011\/12\/probando-udf-para-mysql-title-case\/?share=facebook\" target=\"_blank\" title=\"Haz clic para compartir en Facebook\"><span>Facebook<\/span><\/a><\/li><li class=\"share-twitter\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-twitter-418\" class=\"share-twitter sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2011\/12\/probando-udf-para-mysql-title-case\/?share=twitter\" target=\"_blank\" title=\"Haz clic para compartir en Twitter\"><span>Twitter<\/span><\/a><\/li><li><a href=\"#\" class=\"sharing-anchor sd-button share-more\"><span>M\u00e1s<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><div class=\"sharing-hidden\"><div class=\"inner\" style=\"display: none;\"><ul><li class=\"share-email\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-email sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2011\/12\/probando-udf-para-mysql-title-case\/?share=email\" target=\"_blank\" title=\"Haz clic para enviar por correo electr\u00f3nico a un amigo\"><span>Correo electr\u00f3nico<\/span><\/a><\/li><li class=\"share-print\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-print sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2011\/12\/probando-udf-para-mysql-title-case\/\" target=\"_blank\" title=\"Haz clic para imprimir\"><span>Imprimir<\/span><\/a><\/li><li class=\"share-end\"><\/li><li class=\"share-linkedin\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-linkedin-418\" class=\"share-linkedin sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2011\/12\/probando-udf-para-mysql-title-case\/?share=linkedin\" target=\"_blank\" title=\"Haz clic para compartir en LinkedIn\"><span>LinkedIn<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Conocemos \u00abde sobra\u00bb lo que hacen las funciones LCASE y UCASE en MySQL, otros gestores tambi\u00e9n la implementan con alguna variaci\u00f3n en el nombre pero con el mismo resultado. Pero que pasa si queremos una funci\u00f3n que convierta un texto &hellip; <a href=\"https:\/\/www.latindevelopers.com\/ivancp\/2011\/12\/probando-udf-para-mysql-title-case\/\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n<div class=\"sharedaddy sd-sharing-enabled\"><div class=\"robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing\"><h3 class=\"sd-title\">Compartelo:<\/h3><div class=\"sd-content\"><ul><li class=\"share-facebook\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-facebook-418\" class=\"share-facebook sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2011\/12\/probando-udf-para-mysql-title-case\/?share=facebook\" target=\"_blank\" title=\"Haz clic para compartir en Facebook\"><span>Facebook<\/span><\/a><\/li><li class=\"share-twitter\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-twitter-418\" class=\"share-twitter sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2011\/12\/probando-udf-para-mysql-title-case\/?share=twitter\" target=\"_blank\" title=\"Haz clic para compartir en Twitter\"><span>Twitter<\/span><\/a><\/li><li><a href=\"#\" class=\"sharing-anchor sd-button share-more\"><span>M\u00e1s<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><div class=\"sharing-hidden\"><div class=\"inner\" style=\"display: none;\"><ul><li class=\"share-email\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-email sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2011\/12\/probando-udf-para-mysql-title-case\/?share=email\" target=\"_blank\" title=\"Haz clic para enviar por correo electr\u00f3nico a un amigo\"><span>Correo electr\u00f3nico<\/span><\/a><\/li><li class=\"share-print\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-print sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2011\/12\/probando-udf-para-mysql-title-case\/\" target=\"_blank\" title=\"Haz clic para imprimir\"><span>Imprimir<\/span><\/a><\/li><li class=\"share-end\"><\/li><li class=\"share-linkedin\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-linkedin-418\" class=\"share-linkedin sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2011\/12\/probando-udf-para-mysql-title-case\/?share=linkedin\" target=\"_blank\" title=\"Haz clic para compartir en LinkedIn\"><span>LinkedIn<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><\/div><\/div><\/div><\/div><\/div>","protected":false},"author":1,"featured_media":249,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":""},"categories":[7,10,22],"tags":[17,12,20,32],"jetpack_featured_media_url":"https:\/\/www.latindevelopers.com\/ivancp\/wp-content\/uploads\/logo-mysql-170x115-e1302270861102.png","jetpack_shortlink":"https:\/\/wp.me\/p1tEO5-6K","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/posts\/418"}],"collection":[{"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/comments?post=418"}],"version-history":[{"count":13,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/posts\/418\/revisions"}],"predecessor-version":[{"id":474,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/posts\/418\/revisions\/474"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/media\/249"}],"wp:attachment":[{"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/media?parent=418"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/categories?post=418"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/tags?post=418"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}