Skrypty dla MS SQL i polskie znaki
Kategoria Do zapamiętania, Programowanie dn. 12 gru, 2007
Zawsze myślałem, że problemy dotyczące kodowania polskich znaków nie dotyczą użytkowników Windows. W końcu to taki spójny i jednolity system, posiadający nawet swój własny ‘standard’ kodowania. Jakież było moje rozczarowanie, gdy prosty skrypt batchowy pozwalający na wczytanie skryptu SQL do bazy daanych zainstalowanej w MS SQL Server:
set OSQL="c:\\Program Files\\MS SQL Server\\80\\Tools\\Binn\\osql.exe"
%OSQL% -E -d moja_baza < skrypt.sql
…wczytał, i owszem, moje wypociny w SQL, ale… zupełnie zniekształcił polskie znaki. Dostałem w ich miejsce jakieś dziwaczne krzaki, przypominające czasy źle skonfigurowanych Linuksów ;)
Nie pomaga w tej sytuacji zmiana kodowania pliku wejściowego (skrypt.sql), ani cudaczne opcje, z którymi można uruchomić ‘osql’.
Okazuje się, że winą za ten stan rzeczy obarczać możemy… windowsowy wiersz poleceń. Otóż ‘cmd.exe’, w środowisku którego wykonywane są wszystkie skryptu batchowe w Windows, pracuje używając innego kodowania znaków niż reszta systemu. Dlaczego? Nie mam pojęcia, pewnie ze względu na kompatybilność z DOS’em.
Sposobem obejścia tego problemu jest rezygnacja z windowsowej możliwości przekierowania strumieni na wejścia/wyjścia programów (bo to właśnie tam powstaje nieszczęsna konwersja znaków do DOS’owych krzaków). Na szczęście znalazła się w opcjach ‘osql’ (czyli trochę jednak skłamałem pisząc kilka linijek wyżej, że ‘osql’ nie miał pomocnej w tej sytuacji opcji ;) ) możliwość wykonania polecenia z plikiem zadanym na wejściu.
Rozwiązaniem jest zapisanie skryptu w kodowaniu, którego używa MS SQL Server (u mnie UTF-8) i wykonanie poniższego poleconka (uprzednio oczywiście ustawiając zmienną OSQL):
%OSQL% -E -d moja_baza -i skrypt.sql
Od tej pory znaki ze skryptu wędrują nienaruszone prosto do mojej bazy :)
10 lutego, 2008 o 23:49
Rzeczywiście kodowanie używane domyślnie przez konsolę to odpowiednie kodowanie DOS (w przypadku polskiego systemu – CP852). Kodowanie konsoli można jednak zmienić poleceniem CHCP, np. CHCP 1250 spowoduje, że konsola będzie używać tego samego kodowania, co Windows, czyli Windows-1250. CHCP 28592 zmieni kodowanie używane przez konsolę na ISO-8859-2 itd.