problem: mysql, czytanie z pliku i znaki specjalne

0

Witam,

Szukalem na forum ale sie nie doszukalem, a poniewaz rece mi juz opadaja to postanowilem do Was napisac...

Robie program w ktorym musze miec mozliwosc wyeksportowania i importowania calej bazy danych z mysql'a, o ile eksport idzie bezproblemowo o tyle z importem juz nie jest tak latwo, robie to w ten sposob, ze przy eksporcie do pliku zapisuje cale instrukcje sql'owe, a potem tylko robie normalny odczyt pliku i uruchamiam sql'a, problem pojawia sie w chwili gdy w odczytanej lini z pliku znajduje sie zarowno znak ` jak i : (niby apostrof ale ten kolo jedynki na klawiaturze alfanumerycznej, i dwukropek) jesli w lini wystapi sam dwukropek, to nie ma problemu, jesli wystapi sam apostrof, to tez nie ma problemu, jesli natomiast w lini wystapia oba te znaki to juz jest zle, przykladowy insert:

INSERT INTO "pytanie" VALUES ("1","Alfabet Morse`a jest:","fajny","niepotrzebny","beznadziejny","zadko uzywany");

a tutaj kod ktory ma go wsadzic do bazy

 assignfile(plik, nazwa2);
 reset(plik);
 while not eof(plik)  do
 begin
      Form1.Query1.Close;
      Form1.Query1.SQL.Clear;
      readln (plik, lan);
      Form1.Query1.SQL.Add(lan);
      Form1.Query1.ExecSQL;
 end;
 closefile(plik);

pomijam fakt ze mecze sie strasznie aby moc uzywac wlasnie znakow typu apostrof, i dlatego uzywam wlasnie tego znaku kolo liczby 1...

prosze o jakiekolwiek info od bardziej zaawansowanych userow tego forum, bo juz normalnie mi rece opadaja...

0

A nazwa tabeli po co jest w cudzysłowie?

0

dla zasady, moze nie byc, to bez roznicy...

0

Mi na przykład z tym cudzysłowiem też nie działa, a bez działa, dlatego pytam.

0

Dopiero teraz mogłem to sprawdzic, i niestety u mnie problem wciaz sie pojawia, oto dokladny błąd: "Project Project1.exe raised exception class EDBEngineError with message 'Missing right quote.'. Process stopped. Use Step or Run to continue." wiec niby czepia sie nie ze zamknąłem apostrofu, ale jak skasuje ten dwukropek lub apostrof to jest ok, dodam ze testowalem to z nazwa tabeli w cudzyslowiu jak i bez niego.

Dlaczego u Ciebie dziala? moze dlatego ze dałeś inne typy pól w tabeli, u mnie to wyglada tak :

p_id: int(11) - primary key
p_pytanie: text
p_odpa:text
p_odpb:text
p_odpc:text
p_odpd:text
p_wodp:int(1)

niestety musze miec pola typu text bo potrzebuje wiecej nix 255 znakow, any idea?

wlasnie przetestowalem jeszcze jedno, jesli doda sie drugi apostrof ten kolo jedynki, tak zeby byly dwa kolo siebie, to wszystko dziala ladnie, tylko ze w bazie jest zapisywane jako dwa :-/ na upartego przy wyswietlaniu pytania moge jeden usuwac :-|

0

Probelmy ze znaczkami wynikają z rodzaju BD, osobiście polecam przejście na FireBirda - tam nie ma takich problemów. Co do długości tekstu - zalezy od bazy danych - czasem są mozliwości pól typu memo, jesli nie to BLOB, wielki osławiony BLOB. Tam możesz umieścić cąły plik z tekstem:)

0

Hallo Lardux!

Nie uzywam MySQL i dlatego nie wiem jakiej skladni ta baza danych wymaga w rozkazie INSERT. Mam tu na mysli apostrof i cudzyslow. Mimo to mam nadzieje, ze ponizsza uwaga moze byc uzyteczna:

Apostrof, a dokladniej "quote" (nie wiem czy to jest dokladne tlumaczenie), jest w Pascalu (Delphi) znakiem specjanym, ktory oznacza poczatek albo koniec stalej lancuchowej. Definiujac stala lancuchowa ujmuje sie ja w apostrofy. Rozkaz SQL jest tez taka stala lancuchowa (patrz przyklady ponizej). Kazde wystapienie znaku apostrofu w srodku tekstu jest rozumiane jako poczatek albo koniec stalej lancuchowej. Co jest zgodne z jego specjalnym znaczeniem. Kiedy chcemy pozbawic apostrof jego specjalnego znaczenia i uzyc go jako zwyklego znaku, to musimy uzyc go podwojnie (ponizej nie uzyto cudzyslowow):

sql_string := 'insert into tabela values (''mis'', ''pluszatek'')';
Query1.SQL.Clear;
Query1.SQL.Add(sql_string);
Query1.ExecSQL;

Powoduje zapisanie w tabeli nastepujacych danych: mis pluszatek

sql_string := 'insert into tabela values (''jimmy'', ''o''''connor'')';
Query1.SQL.Clear;
Query1.SQL.Add(sql_string);
Query1.ExecSQL;

Powoduje zapisanie w tabeli nastepujacych danych: jimmy o'connor

sql_string := 'insert into tabela values (''jimmy'', ''o´connor'')';
Query1.SQL.Clear;
Query1.SQL.Add(sql_string);
Query1.ExecSQL;

Powoduje zapisanie w tabeli nastepujacych danych: jimmy o´connor

sql_string := 'insert into tabela values (''jimmy'', ''o`connor'')';
Query1.SQL.Clear;
Query1.SQL.Add(sql_string);
Query1.ExecSQL;

Powoduje zapisanie w tabeli nastepujacych danych: jimmy o`connor

Pozdrawiam
Markus
[???]

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