Conocemos «de sobra» lo que hacen las funciones LCASE y UCASE en MySQL, otros gestores también la implementan con alguna variación en el nombre pero con el mismo resultado.
Pero que pasa si queremos una función que convierta un texto al tipo Titulo, conocido también como title case, es decir convertir «un texto arbitrario» en «Un Texto Arbitrario«, para este caso no existe la función mágica que haga esa conversión y tenemos que escribir una propia.
No es necesario «reinventar la rueda» (aunque podría hacerlo), buscando encontré un repositorio de funciones UDF para MySQL: http://www.mysqludf.org/ , hay varias funciones agrupadas según el objetivo/funcionalidad, solo tienen que descargar el código fuente, compilarlo y agregarlo como funciones nuevas en vuestros servidores MySQL.
He aislado la función str_ucwords (que convierte un texto a «Title Case») en un archivo separado para mostrarles como es que podemos compilar una UDF para MySQL.Pero he modificado el archivo por que solo funcionaba con parámetros constantes, ahora la función acepta nombres de columnas como parámetros.
Pueden descargar el archivo fuente: ucwords.c
Para compilarlo necesitan unas tres instrucciones:
#Compilamos el programa
ivancp@ubuntu$ gcc ucwords.c -o ucwords.so -shared -lmysqlclient -I/usr/include/mysql
#Copiamos el archivo de salida en la carpeta de plugins de mysql
ivancp@ubuntu$ sudo cp ucwords.so /usr/lib/mysql/plugin
#Quitamos el permiso de ejecución del archivo
#para que pueda cargarlo correctamente
ivancp@ubuntu$ sudo chmod -x /usr/lib/mysql/plugin/ucwords.so
- La opción -shared compila el archivo para que pueda ser usado como librería.
- La descripción del resto de parámetros van a encontrarla en la entrada: Leer datos de MySQL desde C
Ahora debemos agregar la función a MySQL:
mysql> create function str_ucwords returns string soname 'ucwords.so';
Query OK, 0 rows affected (0.00 sec)
mysql>
Ahora veamos algunas pruebas, esta es una consulta común (los datos están almacenados en mayúsculas o Upper Case):
mysql>select nombres from tabla;
+----------------------------------+
| nombres |
+----------------------------------+
| AGUILAR PALACIOS RICARDO |
| ANDIA MARQUEZ LUIS MELITON |
| CUYUBAMBA RAMOS VICTOR ALEJANDRO |
| FELICIANO VELAZCO VICTORIA |
| FLORIDA EVANGELISTA LILA REYNA |
| LEON LAULATE FERNANDO |
| PALACIOS LOPEZ ROXANA BEATRIZ |
| REATEGUI RAMIREZ CARLOS |
| REINOSO MORI JORGE WILLY |
| SALAZAR VALDIVIA WALTER |
| SANCHEZ TUTUSIMA CARMEN ROSA |
| VELAZCO BERROA PETRONA |
+----------------------------------+
12 rows in set (0.00 sec)
Aquí esta lo que queremos ver, la consulta primero convierte a minúsculas todo el campo y luego convierte éste resultado a Title Case, vean:
mysql>select str_ucwords(lcase(nombres)) from tabla;
+----------------------------------+
| str_ucwords(lcase(nombres)) |
+----------------------------------+
| Aguilar Palacios Ricardo |
| Andia Marquez Luis Meliton |
| Cuyubamba Ramos Victor Alejandro |
| Feliciano Velazco Victoria |
| Florida Evangelista Lila Reyna |
| Leon Laulate Fernando |
| Palacios Lopez Roxana Beatriz |
| Reategui Ramirez Carlos |
| Reinoso Mori Jorge Willy |
| Salazar Valdivia Walter |
| Sanchez Tutusima Carmen Rosa |
| Velazco Berroa Petrona |
+----------------------------------+
12 rows in set (0.00 sec)
Funciona a la perfección!
Por favor revisen la documentación, en otro post explicaré que deben tener en cuenta para elaborar sus propios UDF:
He estado chequeando tu pagina y tienes un contenido muy bueno, sigue asi.
Interezante articulo, aclarame si entendi, esto es como hacer funciones, pero externas desde algun lenguaje nativo con C?
Claro! y podemos utilizar toda la potencia del lenguaje… pero también tenemos que tener en cuenta que puede mermar el rendimiento del servidor si no optimizamos.
Se me ocurre que puedo implementar una función con el nombre: send_query_result_to_email(…)
Entonces, sera necesario un nuevo POST.
>D
Hace un tiempo obtuve un resultado parecido usando las funciones almacenadas: http://cambrico.net/09-07-2008/como-poner-la-primera-letra-de-una-frase-en-mayusculas-con-mysql
Tu solución es reveladora, no tenía ni idea que pudieras incluir este tipo de funciones en el «core» de MySQL
Pedro, estaba pensando en una solucion como la tuya pero una vez vi las entrañas de MySQL (en C) y no me detuve hasta conseguir que funcione (no fue muy complicado) ahora me he propuesto implementar una funcion para enviar un correo electronico desde MySQL cuando salga voy a postearlo.
Realmente muy util la información que has puesto. He llegado a tu post buscando información sobre las udfs para poder ejecutar una aplicación externa desde un trigger de una base de datos en mysql. El problema que sigo teniendo reside el mysql lo tengo instalado a traves de xampp (estoy intentando montar una pequeña intranet de aplicaciones) y no consigo localizar el directorio de plugins de mysql. Es mi primer intento de programar mysql (a excepcion de varias consultas a traves de odbc) y voy un poco perdido. Gracias