Probando UDFs para MySQL: Title Case

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:

http://dev.mysql.com/doc/refman/5.0/en/adding-udf.html