Desarrollando una sitio con JSP (aplicación web java) y acceso a una base de datos Mysql, ya terminando la aplicación al ser montada en un servidor la probé y me surgió el problema de que cuando ingresaba una tilde o una eñe en la base de datos no se almacenaban correctamente me surgían unos símbolos extraños almacenados y por lógica al ser consultados salían de la misma forma. es decir:
Ingresaba en un campo de texto APLICACIÓN y en la base de datos me almacenaba algo como esto APLICACIóN, y en el caso de MAÑANA me guardaba MAñANA.
Lo primero de todo revise las codificaciones de caracteres tanto de la base de datos como de las paginas JSP, en la base de datos Mysql tenia el character set = utf-8 la misma codificación que en las paginas JSP tenia las siguientes lineas que codifican esto:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
Y la que va dentro de la etiqueta META dentro del HEAD, en la cual debe estar content="text/html; charset=UTF-8":
Luego toco recurrir al de siempre Google donde encontré información de todo desde modificar el servidor Tomcat hasta crear lineas de códigos que transformar los caracteres a la codificación deseada. El problema es que modificar el servidor Tomcat siempre sera un problema una por complejidad y otra por poca información especialmente en español (maldito ingles) y el otro de ingresar lineas de código que transforman los caracteres es un poco ambiguo, aquí les dejo una de las listas de las posibles soluciones que encontré:
- Para modificar dato por dato que se obtiene al hacer el submit.
- Solución desde base de datos Mysql modificando el juego de caracteres.
- Un foro completo sobre el mismo tema con posibles soluciones qu pueden ayudar.
- La solución lógica al problema modificando el servidor Tomcat pero no se porque no me salió, talves por la version del Tomcat.
- Pagina que al final muestra una lista bien amplia de problemas similares, vale la pena darle una ojeada.
Cabe recalcar que para obtener los datos de los formularios después de hacer el submit ocupo servlets y pensé ver desde ahí cual es el problema y descubrí que con la funcion request.getParameter() antes de almacenarlos en la base de datos obtiene los datos de forma incorrecta, entonces la base de datos esta bien, luego buscando información sobre esta función (REQUEST) en el sitio de java encontré la subfunción setCharacterEncoding la solución a mi problema ya que esta permite setear la codificación de caracteres para los datos que recibe del submit.
Entonces lo que hice fue dentro de los servlets que llamo para los submits de formularios ingresar esta linea de código antes de hacer cualquier obtención u operación de datos de la siguiente manera:
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
//luego el resto de codigo donde se realiza calculos
//o donde se almacenara en la base de datos
}
Talves la solución no sea tan optima pero me funciono y es mas rápida y sencilla que otras, agregando esa linea todos los servlets ya pude almacenar correctamente en mi base de datos mysql las tildes y las eñes, que son muy usudas en el español especialmente la tilde.