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
[-]
with DataBase do
begin
try
if not TestConnected then
begin
DBName := Entorno.BaseDeDatos;
DBParams.Clear;
DBParams.Values['user_name'] := Entorno.UsuarioBD;
DBParams.Values['password'] := Entorno.ClaveBD;
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;