Ver Mensaje Individual
  #2  
Antiguo 09-12-2025
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Reputación: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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;

Última edición por duilioisola fecha: 09-12-2025 a las 08:40:10.
Responder Con Cita