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)
- Para cambiar tu consolaa UTF-8. Run > Run Configurations > Commons y elige UTF-8 (Clic sobre Apply)
4 Ejecuta el ejemplo
- Recuerca cambiar la url, el usuario y la contraseña por el de tu base de datos MySQL.
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.