Кодировка строк для insert в MySQL

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Кодировка строк для insert в MySQL

Сообщение arra » 06.04.2013 11:58:41

добрый день.
Пытаюсь загрузить данные из DBF в MySQL. делаю многострочный insert:
Код: Выделить всё
while not myDBF.EOF do
    begin
     id := myDBF.FieldByName('Id').AsInteger;
     s_nazv :=AnsiToUtf8(myDBF.FieldByName('Name').AsString);
     s_date := FormatDateTime('YYYY-MM-DD hh:mm:ss',
     myDBF.FieldByName('date_add').AsDateTime);

     buf := 'insert into sakila.order(nazv,id_product,date_add) '+
     ' VALUES('+''''+s_nazv+''''+','+IntToStr(id)+','+''''+s_date+''''+');';

     mainForm.ZaprMySQL.SQL.Add(buf);
     myDBF.Next;
     RowCount := RowCount+1;
    end;
MyDbf.Close;
mainForm.ZaprMySQL.ExecSQL;


В name в DBF - русские буквы. Если смотреть отладчиком, то s_nazv содержит нормальную строку с русскими буквами, а вот buf содержит что-то вроде
insert into sakila.order(nazv,id_product,date_add) VALUES('''#209#197#205''',12,''2013-01-01 04:03:01'')


Соответственно, при попытке mainForm.ZaprMySQL.ExecSQL происходит ругань мускула. Как сформировать строку с нормальными русскими буквами, а не кодами символов?
buf изначально был string, потом пробовал UTF8String - без разницы. В мускуле кодировка таблицы UTF8.

Заранее спасибо.
arra
новенький
 
Сообщения: 27
Зарегистрирован: 30.03.2013 22:58:27

Re: Кодировка строк для insert в MySQL

Сообщение hovadur » 06.04.2013 15:06:09

Я бы посмотрел кодировку myDBF, вдруг она не Ansi?
hovadur
постоялец
 
Сообщения: 116
Зарегистрирован: 31.01.2013 15:50:41

Re: Кодировка строк для insert в MySQL

Сообщение kosteek » 06.04.2013 16:48:06

Попробуй подключить в uses LConvEncoding
s_nazv :=CP1251ToUtf8(myDBF.FieldByName('Name').AsString);
kosteek
постоялец
 
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: Кодировка строк для insert в MySQL

Сообщение arra » 06.04.2013 22:26:41

Я бы посмотрел кодировку myDBF, вдруг она не Ansi?


Ansi, я проверял. Попробовал CP1251ToUtf8, то же самое. Что интересно, при запуске под Линь в вылезающей ошибке русские буквы отображаются нормально! Может, не в этом косяк? Может, я дату неправильно как-то передаю?
Скрин ошибки прикрепляю.

Добавлено спустя 11 минут 14 секунд:
А, не, нифига подобного. Сократил запрос до:

Код: Выделить всё
buf := 'insert into sakila.order(id_product) '+VALUES('+IntToStr(id)+');';


Всё равно выдавал глюк. Убрал цикл, убрал точку с запятой, разделяющую запросы, оставил один запрос. Заработало! В связи с чем возникает вопрос - как правильно пихать в MySQL запрос из нескольких запросов-insert? Вроде бы всегда в таких случаях запросы точками с запятой разделялись...

Добавлено спустя 14 часов 26 минут 20 секунд:
Ура, нашёл! Оказывается, надо делать один длинный insert, а не несколько разделённых запятыми. Правильно отправлять мускулу примерно такой запрос:
Код: Выделить всё
insert into mytable (id,name) VALUES(1,'aaa'),(2,'ббб'),(3,'ггг')
У вас нет необходимых прав для просмотра вложений в этом сообщении.
arra
новенький
 
Сообщения: 27
Зарегистрирован: 30.03.2013 22:58:27


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 232

Рейтинг@Mail.ru
cron