Foros del Web » Programación para mayores de 30 ;) » .NET »

Error en la codificación de caracteres en BBDD

Estas en el tema de Error en la codificación de caracteres en BBDD en el foro de .NET en Foros del Web. Hola a todos, tengo el siguiente problema. Las tablas de mi BBDD estan en latin1 y he querido cambiarlas entrando por linea de comandos a ...
  #1 (permalink)  
Antiguo 15/05/2014, 03:51
 
Fecha de Ingreso: julio-2010
Mensajes: 298
Antigüedad: 13 años, 9 meses
Puntos: 8
Error en la codificación de caracteres en BBDD

Hola a todos, tengo el siguiente problema. Las tablas de mi BBDD estan en latin1 y he querido cambiarlas entrando por linea de comandos a mi BBDD MySQL usando el siguiente comando:
Código MySQL:
Ver original
  1. ALTER TABLE `myDDBB`.`myTable` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
No me da ningún error pero me la tabla está en "utf8 default collation", la cual cosa hace que no acepte ni acentos, ni ññññ, ni alguno caracteres especiales.

La BBDD está en "CHARACTER SET utf8 COLLATE utf8_unicode_ci"

Alguien sabe a qué se debe?

Muchas gracias

Última edición por gnzsoloyo; 15/05/2014 a las 04:19
  #2 (permalink)  
Antiguo 15/05/2014, 04:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error en la codificación de caracteres en BBDD

Error: UTF8 acepta caracteres extendidos, proque precisamente es el formato más general para eso. En todo caso si no entran bien puede ser error de aplicación o de charset de la conexión, pero no por el UTF8.
Por otro lado, CONVERT no es una clausula de ALTER TABLE, por lo que no te funcionará así.

¿Exactamente cómo se manifiesta tu problema de caracteres, y en qué contexto lo ves (aplicación, consultas, interfaces de administracion, etc?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 15/05/2014, 04:46
 
Fecha de Ingreso: julio-2010
Mensajes: 298
Antigüedad: 13 años, 9 meses
Puntos: 8
Respuesta: Error en la codificación de caracteres en BBDD

Hola gnzsoloyo, en una de mis páginas web, lo que hago por código en C# es un REPLACE de ciertos caracteres "()¿?<> ..." por otros "αβτμΞΣ ...", y cuando los pongo en la BBDD ésta me los introduce mal, ya que los caracteres reemplazados no los sabe insertar correctamente.
A modo de ejemplo:
Escribo: ¿Le ha gustado?
Debe insertar: ΣLe ha gustadoβ
Inserta: SLe ha gustadof

Alguna idea?
  #4 (permalink)  
Antiguo 15/05/2014, 05:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error en la codificación de caracteres en BBDD

Ideas... Varias.
Pero la primera pregunta es ¿Por que haces esos reemplazos?
Segunda seria qué librería usas para conectar a MySQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 15/05/2014, 07:26
 
Fecha de Ingreso: julio-2010
Mensajes: 298
Antigüedad: 13 años, 9 meses
Puntos: 8
Respuesta: Error en la codificación de caracteres en BBDD

Hola gnzsoloyo,
hago ese reemplazo porqué la página en cuestión es para editar una encuesta y el usuario tiene que poder introducir cualquier caracter que desee, y para permitir eso y que no de error al introducir "<>()?¿$%& ..." hago un REPLACE y cuando muestro la encuesta deshago el REPLACE.

Para conectar con BBDD uso "MySQL ODBC 5.1 Driver".
  #6 (permalink)  
Antiguo 15/05/2014, 07:37
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error en la codificación de caracteres en BBDD

Ninguno de esos caracteres debería generar problema de errores, en tanto lo controles en la aplciación. Existen métodos en cada lenguaje para resolver los problemas que peudan causar esos caracteres, sin necesidad de poner otras cosas que realmente te van a dar más problemas.
Por otro lado, si estás trabajando en C#.Net, usar ODBC es una pésima idea. MySQL tiene librerías específicas para .Net.
A mi entender el problema que tienes es más de programación que de BBDD.
En lo que se refiere a la tabla, te recomiendo leer el manual de referencia con mas cuidado, y en especial prestar atención a la versión de MySQL que esté corriendo, porque son sentencias que han sufrido muchos cambios en cada reelase.
Código MySQL:
Ver original
  1. ALTER TABLE tbl_name CHARACTER SET utf8;
Código MySQL:
Ver original
  1. ALTER TABLE tbl_name CHARACTER SET latin1;

Pero, insisto, tu problema es de programación y de lirebría de acceso a MYSQL, no de BBDD. Lo mejor que pudes usar en UTF8.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 15/05/2014, 08:27
 
Fecha de Ingreso: julio-2010
Mensajes: 298
Antigüedad: 13 años, 9 meses
Puntos: 8
Respuesta: Error en la codificación de caracteres en BBDD

Hola gnzsoloyo,
El problema es que si dejo introducir esos caracteres puede hacer que alguien meta código y hacer SQL Injection.
Cómo puedo hacer para evitar que usen estos caracteres con fines malintencionados?
  #8 (permalink)  
Antiguo 15/05/2014, 09:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error en la codificación de caracteres en BBDD

Por lo pronto, no se deben construir en C#.net las sentencias SQL como cadenas de texto, sino por parametrización. De ese modo cualquier sql-injection disparará errores de sintaxis.
Por otro lado, existen en los diferentes lenguajes métodos para sanitizar los datos, sin necesidad de poner basura en los mismos.
Además, si vas a operar contra una base de datos, te recomiendo enfáticamente usar stored procedures, en especial con .Net, ya que los SP son invulnerables al sql-injection, en especial cuando no incluyes sentencias preparadas en ellos.
Podríamos seguir este thread en el foro de .Net, si quieres que veamos la codificacion adecuada para tales cosas.
¿Quieres que mueva el hilo a ese foro y vemos los temas de C#.Net (todavía no me has confirmado si usas .Nt o no, pero lo estoy suponiendo).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 15/05/2014, 09:35
 
Fecha de Ingreso: julio-2010
Mensajes: 298
Antigüedad: 13 años, 9 meses
Puntos: 8
Respuesta: Error en la codificación de caracteres en BBDD

Hola, sí estoy usando .Net y para programat c#
Las queries las estoy ejecutando desde una librería que me he montado para ejecutar queris y las construyo tal que así:
Código:
public int Update(MySqlConnection conn, string value1, string value2, string value3)
{
string sql = "UPDATE myTable SET field1 = @field1, field2 = @field2 WHERE id=@id";return SqlHelper.ExecuteNonQuery(conn, sql, CommandType.Text,
                new ParameterObject("@field1", value1),
                new ParameterObject("@field2", value2),
                new ParameterObject("@id", value3);
}
Si quieres muévolo al foro que creas más conveniente.

Última edición por Pimager; 15/05/2014 a las 09:37 Razón: Error en el texto introducido
  #10 (permalink)  
Antiguo 15/05/2014, 09:45
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error en la codificación de caracteres en BBDD

MySqlConnection no pertenece a ODBC, que yo sepa, sino a MySQLConnector.NET.
¿Cuál es exactamente la librería que usas?

Por cierto, para crear la conexión basandola en UTF8, con el MySQL Connector.Net, debes usar esto:
https://www.connectionstrings.com/my...character-set/

En cuanto a un ejemplo de parametrización, podría ser:
Código vb:
Ver original
  1. using System;
  2. using System.Data;
  3. using MySql.Data;
  4. using MySql.Data.MySqlClient;
  5.  
  6. public class TutorialCSharp
  7. {
  8.     public static void Main()
  9.     {
  10.         string connStr = "Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;CharSet=utf8;";
  11.         MySqlConnection conn = new MySqlConnection(connStr);
  12.         try
  13.         {
  14.             conn.Open();
  15.  
  16.             string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent=@Continent";
  17.             MySqlCommand cmd = new MySqlCommand(sql, conn);
  18.             cmd.Parameters.AddWithValue("@Continent", "Africa");
  19.             MySqlDataReader rdr = cmd.ExecuteReader();
  20.  
  21.             while (rdr.Read())
  22.             {
  23.                 ' Lo que sea que hagas con el resultado
  24.            }
  25.             rdr.Close();
  26.         }
  27.         catch (Exception ex)
  28.         {
  29.             ' Lo que hagas en la exception
  30.        }
  31.  
  32.         conn.Close();
  33.     }
  34. }
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 15/05/2014 a las 10:02
  #11 (permalink)  
Antiguo 15/05/2014, 10:19
 
Fecha de Ingreso: julio-2010
Mensajes: 298
Antigüedad: 13 años, 9 meses
Puntos: 8
Respuesta: Error en la codificación de caracteres en BBDD

Hola gnzsoloyo, lo revisaré y comprobaré que lo tengo montado como en tu ejemplo.
Lo que sí se seguro es que construyo las querys mediante parametrización, y según he leído, haciéndolo así se evita el SQL Injection, verdad?
Si me lo confirmas voy a deshacer los sityios en los que hago los mencionados "REPLACE" y creo que tendré resuelto el problema.

Muchas gracias

Etiquetas: bbdd, collate, mysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:38.