Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Problemas con los charset y collation (https://www.clubdelphi.com/foros/showthread.php?t=97929)

Fita 08-12-2025 23:27:19

Problemas con los charset y collation
 
Hola a todos.
Tengo un sistema instalado en varios colegios.
Si veo los datos en uno de los colegios se ve bien, por ejemplo: Díaz Gonzalez PERO cundo traigo una backup a mi maquina se ve asi: DÃ*az Gonzalez
El charset es Utf8 y Collation Utf8_spanish_ci

Porque sucede esto? y como lo soluciono.

Trabajo con MySql 5.6
Gracias

duilioisola 09-12-2025 08:33:47

No conozco MySQL, pero trato con Firebird y supongo que la lógica debe ser similar.

Por un lado está el charset de la base de datos
Por otro lado está el charset del cliente (web, aplicación, servicio, etc.)

Cuando creas la base de datos le dices qué charset tiene cada campo.
Cuando conectas le dices con qué charset trabajas en la aplicación.
El driver cliente de base de datos hará la conversión (trasliteración) de un charset al otro.

Si en alguno de los dos sitios omites el charset, no habrá trasliteración y te devolverá los bites que interpretará como mejor pueda.

Letra Ñ -> es el código Unicode "U+00D1" -> que se representa por 2 bytes en UTF8 y al interpretarse como WIN1252 queda "Ñ"

Ej.
Firebird
Tabla con campo texto rellenado con charset UTF8 y collate CaseInsensitive + AccentInsensitive
Código SQL [-]
CREATE TABLE PERSONAS (
    ID INTEGER,
    NOMBRE VARCHAR (100) CHARACTER SET UTF8 COLLATE UNICODE_CI_AI
);

Delphi
Conexión desde windows. el charset de Windows es WIN1252
Código Delphi [-]
  UsuarioBD := 'SYSDBA';
  ClaveBD := 'masterkey';
  CharsetBD := 'WIN1252';
  RolBD := '';

  [...]

  with DataBase do
  begin
     try
        if not TestConnected then
        begin
           DBName := BaseDeDatos;
           DBParams.Clear;
           DBParams.Values['user_name'] := UsuarioBD;
           DBParams.Values['password'] := ClaveBD;
           if (CharsetBD <> '') then
              DBParams.Values['lc_ctype'] := CharsetBD;
           if (RolBD <> '') then
              DBParams.Values['sql_role_name'] := RolBD;
           Log(format('Conectando. user_name: %s, password: %s, sql_role_name: %s', [DBParams.Values['user_name'], DBParams.Values['password'], DBParams.Values['sql_role_name']]));
           Open;
        end;
     except
        on e: Exception do
           ShowMessage(Format(_('Imposible abrir %s' + #13#10 + 'user_name: %s, sql_role_name: %s.') + #13#10 + e.Message, [BaseDeDatos, UsuarioBD, RolBD]));
     end;
  end;

Garada 09-12-2025 13:59:54

Yo no he usado MySQL en local pero sí en webs.

Si para hacer el backup usas un fichero SQL con los comandos (SQL Dump) para recrear la base de datos asegúrate que el fichero está codificado en UTF8.

Me ha ocurrido que me pasan un fichero codificado en ANSI y sólo tengo que pasarlo a UTF8 con el Notepad++, por ejemplo, antes de importarlo con el PhpMyAdmin.


La franja horaria es GMT +2. Ahora son las 06:32:45.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi