Ver Mensaje Individual
  #3  
Antiguo 13-09-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Reputación: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Yo hace un tiempo migré la base de datos a UNICODE.
La base de datos tenía el charset NONE, por lo que admitía cualquier cosa que le pusieras y no hacía ninguna transformación.
Cuando empecé a entrar y leer datos desde diferentes sistemas empezaron a generarse muchos conflictos:
Desde la web se metía texto en formato UTF-8 y desde Windows se leia como WIN-1252. Lo mismo sucedía cuando se escribía en windows y se leia en la web.

La solución:
Poner los campos texto (CHAR, VARCHAR, BLOB tipo texto) a charset UNICODE.
Luego en la conexión a la base de datos le dices qué charset utilizas y entre el cliente y el servidor hacen la transformación necesaria.

Nota:
Yo trabajo con un Delphi viejo (Delphi 6) por lo que no adminte UTF8 como Charset.

Ejemplo:
Código SQL [-]
-- Definicion de campo de texto con CHARST UNICODE
CREATE DOMAIN DESCRIPCIONES AS  VARCHAR(256) CHARACTER SET UNICODE_FSS 
DEFAULT '' 
NOT NULL 
COLLATE UNICODE_FSS
Código Delphi [-]
  // Conexión a la base de datos indicando el Charset con el que quiero leer los datos
  with DataBase do
  begin
     try
        // Probamos conexion
        if not TestConnected then
        begin
           DBName := Entorno.BaseDeDatos;
           DBParams.Clear;
           DBParams.Values['user_name'] := Entorno.UsuarioBD;
           DBParams.Values['password'] := Entorno.ClaveBD;

           // El charset de la conexion: Normalmente en Windows en castellano WIN1252
           if (Entorno.CharsetBD <> '') then
              DBParams.Values['lc_ctype'] := Entorno.CharsetBD;

           if (Entorno.RolBD <> '') then
              DBParams.Values['sql_role_name'] := Entorno.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
        begin
           try
              if (Assigned(FLogo)) then
                 FLogo.Hide;
           except
           end;
           ShowMessage(Format(_('Imposible abrir %s' + #13#10 + 'user_name: %s, sql_role_name: %s.') + #13#10 + e.Message, [Entorno.BaseDeDatos, Entorno.UsuarioBD, Entorno.RolBD]));
        end;
     end;
  end;
Responder Con Cita