Problem z niezgodnością stron kodowych objawił się kawałek dalej. Chodziło o to, że baza danych Oracle kodowana była w Win1250, a plik źródłowy w UTF8. Po załadowaniu danych do programu porównania wykonywane były poprawnie, ale na etapie wykonywania SQL - nie. Podgląd zmiennych podczas debugowania pokazywał, że zapytanie zostało ładnie skomponowane - zawierało poprawne polskie znaki, ale po przesłaniu do serwera nie wykonywało się poprawnie (SELECT zwracał niepoprawne dane - niekompletny zbiór). Skopiowanie treści zapytania SQL z podglądu zmiennych, wklejenie i uruchomienie w PL\SQL Developerze dawało poprawne wyniki.
Problem rozwiązałem w ten sposób, że na etapie ładowania pliku, od razu wykonywana jest sztywna konwersja UTF8 -> WIN1250 i całość działa teraz bez zarzutu.
Łyżką dziegciu w beczce miodu jest "sztywna konwersja UTF8->WIN1250" - polega to na tym, że muszę jawnie w programie ustawić Encoding źródłowy i docelowy przed załadowaniem danych, żeby mogła się dokonać prawidłowa konwersja.
Kopałem dość długo na Googlach i nie znalazłem sensownego kodu, który pozwalał by jednoznacznie określić kodowanie pliku ZANIM rozpocznie się właściwe ładowanie danych.
Chodzi o to, że używając TStrings.LoadFromFile musze jawnie z góry określić format kodowania pliku, który ładuję. W przeciwnym wypadku automatycznie zostanie ustawione Encoding.Default - co oznacza WinACP (Actual Code Page systemu operacyjnego) = WIN1250. Plik jest w UTF8, więc załadują się krzaki.
Chciałbym osiągnąć taki efekt, że niezależnie w jakim kodowaniu klient dostarczy mi plik - kodowanie zostanie rozpoznane, plik załadowany z tym kodowaniem, a następnie skonwertowany do kodowania zgodnego z bazą danych, z którą aplikacja jest połączona.
Jeżeli chodzi o określenie strony kodowej bazy danych, to jest to dość proste:
SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET' ;
Nie umiem sobie poradzić ze stroną kodową ładowanego pliku.