Article updated on

Java Ejemplo Utf-8 con Eclipse y  Mysql

En la mayoría de los casos los problemas ocurren porque no todo esta codificado en UTF-8 o no estamos recodificando un formato a otro de la manera correcta. Hay que especificar en MySQL que queremos usar este formato para guardarlo enviar o recibir UTF-8. La manera más sencilla es poner establecer UTF-8 por defecto en todos los entornos.

1 - Script para crear la BBDD y una Tabla en UTF-8

  • Tu BB.DD. debe  estar preparada para guardar en este formato por eso debes elegir el formato de caracteres o collation compatible con UTF-8. Elegir uno u otro puede afectar al rendimiento de la aplicación.

CREATE DATABASE `test_db` /*!40100 COLLATE 'utf8_bin' */;

USE `test_db`;

CREATE TABLE `test_table` (
    `text` VARCHAR(50) NULL
)
COLLATE='utf8_bin'
ENGINE=InnoDB;

  • Si estas usando una base de datos ya creada tienes que asegurarte de que es compatible con UTF-8 y que al menos una columna de la base de datos puede contener este formato.

Para modificar la Base de Datos:

ALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_bin;

Para modificar una tabla  :

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8;

Para modificar una columna:

ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;

 

2 - Ejemplo de Código

  • Recuerda que necesitas un MySQL JDBC driver  establecido en tu classpath para poder ejecutar este ejemplo.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MySQLUtf8 {
    public static void main(String[] args) throws Exception {
        Connection myCon = null;
        try {
            String userName = "myuser", password = "mypass";// recuerda cambiar!!
            String url = "jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf-8";// recuerda cambiar!!
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            myCon = DriverManager.getConnection(url, userName, password);
            PreparedStatement preparedStmt;
            try {
                String sql = "INSERT INTO test_table (mytext) values (?)";
                preparedStmt = myCon.prepareStatement(sql);
                preparedStmt.setString(1, "beautiful /ˈbjuːtɪfʊl/ 美麗 美しい جميل");
                preparedStmt.executeUpdate();   
                preparedStmt = myCon.prepareStatement("SELECT mytext from test_table ");
                ResultSet rs = preparedStmt.executeQuery();
                while (rs.next()) {
                    System.out.println("-->" +rs.getString("mytext") + "<--");
                }           
                preparedStmt.close();               
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            System.err.println(e.getMessage());
        } finally {
            if (myCon != null) {
                try {
                    myCon.close();
                } catch (Exception e) { }
            }
        }
    }
}

 

3 - Asegurate de que Eclipse está establecido a UTF-8 en el Código fuente y la Consola.

  • Botón derecho sobre tu archivo java > properties > Resource > Text Encoding. (Selecciona UTF-8 y después haz clic sobre Apply)

img/0/77/_002.jpeg

  • Para cambiar tu consolaa UTF-8.  Run > Run Configurations > Commons y elige UTF-8 (Clic sobre Apply)

img/0/77/_004.jpeg

4 Ejecuta el ejemplo

  • Recuerca cambiar la url, el usuario y la contraseña por el de tu base de datos MySQL.

img/0/77/_006.jpeg

Note 1 - Si usas Connection Pool de Apache Tomcat

Añade  connectionProperties="useUnicode=yes;characterEncoding=utf8;" a tu context.xml ej.

    <Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource"
        driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test_db"
        connectionProperties="useUnicode=yes;characterEncoding=utf8;"
        username="yourUser" password="YourPassword" maxActive="10" maxIdle="0" maxWait="45"
        maxAge="45" removeAbandoned="true" removeAbandonedTimeout="45" />  

 

Más Notas

  • Ten en cuenta de que no funciona con los JDBC drivers ni versiones de MySQL antiguas.