MS SQL Server 2005 + AdoQuery(Delphi) + UTF8

0

Bardzo proste pytanie, ale raczej do ekspertów bo ja już nie mam na to siły. Mam sobie zmienną w formacie UTF-8. Przypisuje do niej nazwę 'Mūminābād' a następnie chcę wartość tej zmiennej umieścić w rekordzie o ID1=2739. Baza znajduje się MS SQL Server 2005. Wszystko działa, tylko dlaczego u licha!!! komenda UPDATE w delphi komponentu ADOQUERY gubi ogonki czyli format UTF-8 !!! ??? Po wykonaniu UPDATE'a w SQL mam wpis bez ogonków :((( czyli coś takiego: Muminabad
Jest to na 100% problem podczas przesyłania komendą UPDATE do SQL'a. Gdy wrzucę na formę wartość tej zmiennej wszystko jest OK. Na SQL'u inne wpisy też są OK - czyli z ogonkami. Nie działa tylko UPDATE ADOQUERY. Sprawdzałem też SQLQUERY oraz komponenty dbExpress - też nie działa. Wszystko było sprawdzone zarówno na Delphi 2009 jak i w Delphi 7 - nie działa :(
Wierzę, że są tu jacyć eksperci i otrzymam odpwoiedź. Wielkie dzięki. Poniżej ten banalny KOD:

procedure TForm1.Button1Click(Sender: TObject);
var utf8 : UTF8String;
begin
utf8:='Mūminābād';
SQL_Update('UPDATE GNS SET NAME='+#39+utf8+#39+' WHERE ID1=2739');
end;

0

Co to za znak #39? Podejrzewam, że apostrof, ale nie sprawdzam. Nie lepiej zrobić to używając format?

  query:=format('update tabela set name = ''%s'' WHERE ID = 50', [string_w_utf8]);

%s nie jest w cudzysłowiach, tylko pomiędzy apostrofami.

Wykonaj coś takiego i sprawdź, co będzie miała zmienna query. Prawdopodobnie będzie dobrze. Spróbuj tak to wykonać(poprzez funkcję format). Jeśli nadal będzie źle, to chyba jedynym wyjściem będzie zapisywanie do bazy nie takiego stringa, tylko kodów ASCII. Tzn. zamiast: "ABC" będziesz zapisywał "656667"

0

Dzięki za odpowiedz, niestety nie pomogło. Znak #39 to oczywiście ' w ASCII. Użyłem tak jak sugerowałeś funkcji Format, jednak nie zadziałało, z resztą nie dziwię się, gdyż jest to tylko inne przedstawienie tej samej komendy. Dodatkowo zasugerowane przez Ciebie QUERY powinno wyglądać jak poniżej:

procedure TForm1.Button1Click(Sender: TObject);
var string_w_utf8 : UTF8String;
begin
string_w_utf8:='Mūminābād';
SQL_Update(Format('UPDATE tabela SET name='+#39+'%s'+#39+' WHERE ID=50', [string_w_utf8]));
end;

Formę jaką podałeś czyli zamiast #39 użycie " zaakceptuje tylko MS ACCESS. Jeśli ktoś używa MS SQL Server 2005 prawidłowe query powinno wyglądać tak:
SQL_Update(Format('UPDATE tabela SET name='+#39+'%s'+#39+' WHERE ID=50', [string_w_utf8]));

zaś pod MS ACCESS tak:
SQL_Update(Format('UPDATE tabela SET name="%s" WHERE ID=50', [string_w_utf8]));

Wpadłem już na jakiś trop -
pod MS ACCESS wszystko aktualizuje się dobrze czyli wpis w bazie jest z ogonkami w UTF8 (ale tylko w BD2009, BD7 nadal nie radzi sobie z ogonkami), natomiast pod MS SQL 2005 ogonki niestety nie przechodzą zarówno w BD2009 jak i BD7. Być może chodzi tutaj o jakieś ustawienia w samym SQL 2005, ale wydaje mi się, że sa ok - COLLATION dla aktualizowanej kolumny mam ustawione na 'SQL_Latin1_General_CP1_CI_AS' (typ nvarchar)

Dzięki za wszelką pomoc i zaangazowanie, nawet te, które nie rozwiąże problemu:)

0
delphiUPDATE napisał(a)

Formę jaką podałeś czyli zamiast #39 użycie " zaakceptuje tylko MS ACCESS. Jeśli ktoś używa MS SQL Server 2005 prawidłowe query powinno wyglądać tak:
SQL_Update(Format('UPDATE tabela SET name='+#39+'%s'+#39+' WHERE ID=50', [string_w_utf8]));

zaś pod MS ACCESS tak:
SQL_Update(Format('UPDATE tabela SET name="%s" WHERE ID=50', [string_w_utf8]));

Bardzo śmieszne rzeczy opowiadasz, bo pisałem aplikacje pod Accessa niestety, a od długiego czasu piszę pod MSSQL i zgadnij co. Nie ma żadnej różnicy. Tylko:

query:=format('UPDATE tabela SET pole = ''%s'' WHERE ID = 5', [moj_string]);

szybciej się pisze i łatwiej odczytać :|

Poza tym sprawdź ustawienia serwera - kodowanie znaków itd.

0

U mnie Delphi (5, 7, 2009) nie trawi w sql query 2 apostrofów i jestem pewien że nikomu Delphi nie strawi 2 apostrofów, gdyż zamykają one stringa dlatego należy zastosować apostrof w formie ASCII - #39. Cudzysłów " zaś jest trawiony tylko przez bazę MS Access, natomiast MS SQL Server 2005 musi mieć 2 apostrofy (co nie jest możliwe w Delphi, chyba ze się używa znaków ASCII #39)

Problem już rozwiązałem - zapis komendy jest prawidłowy, trzeba natomiast pamiętać przy korzystaniu z UTF-8 na MS SQL Server o ustawieniu dla danych zmiennej nvarchar (to n z przodu jest mega wazne) oraz przy wysyłaniu komend UPDATE/INSERT itp (T O W Ł A Ś N I E R O Z W I Ą Z A Ł O M Ó J P R O B L E M) należy koniecznie umieścić prefix N i każdy wpis UTF-8 pojawi się na MS SQL również w UTF-8 (USC2)

Myślałem że uzyskam tutaj odpowiedź błyskawicznie... zwłaszcza, że błąd dotyczył zwykłej SQL'owej komendy, a brak prefixa N można było wychwycić natychmiast (bo to podstawowa kwestia i chyba jedyna (poza nvarchar) przy korzystaniu z utf8 na MS SQL). Czyli siedzą tutaj chyba sami początkujący jak ja, albo jeszcze bardziej początkujący :)

0

co do tego zapisu

SQL_QUERY ('UPDATE tabela SET pole = string_w_utf8 WHERE ID = 5');

zwracam honor. Nie trzeba stosować #39. Zawsze myślałem, że ''(dwa apostrofy w rzeczywistości) jest cudzysłowem czyli ", a jak używamy apostrofu to wystarczy dla stringa jeden czyli tak:

SQL_QUERY ('UPDATE tabela SET pole = 'string_w_utf8' WHERE ID = 5');
i wtedy Delphi się burzy (chce zakończyć stringa wcześniej)

czyli podsumowując:
MS Access akceptuje dwa apostrofy string lub cudzysłów "string" natomiast
MS SQL Server akceptuje tylko dwa apostrofy string a cudzysłowu "string" już nie
Oracle akceptuje tak jak Access dwa apostrofy lub cudzysłów czyli tak lub tak " "

I jednak się czegoś od Was nauczyłem, czyli DZIĘKI :) Wreszcie nie muszę się bawić z tymi durnymi #39#39#39#39#39#39#39#39#39#39#39#39#39#39#39:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1