Delphi и двоичный набор символов (для MySQL) - PullRequest
1 голос
/ 24 июня 2011

Мне нужно импортировать большой xls-файл в базу MySQL. Я пытаюсь использовать конструкцию «LOAD DATA INFILE». Данные в xls содержат символы кириллицы, поэтому у меня возникли некоторые проблемы. Я создаю файл дампа вручную, но «LOAD DATA INFILE» не загружает символы кириллицы. Инструкция MySQL "SELECT ... INTO OUTFILE" работает отлично, но я не могу ее использовать, потому что мне нужен импорт из файла сохранения "SELECT ... INTO OUTFILE" с двоичным набором символов, как я могу это сделать с Delphi 2009?

Мой код:

procedure TfmImportGoods.btnImportClick(Sender: TObject);
var
  sToFile: TStringStream;
  sTemp: AnsiString;

  function FixString(s: String): String;
  begin
    Result := s;
    Result := SysUtils.StringReplace(Result, #10, '', [rfReplaceAll]);
    Result := SysUtils.StringReplace(Result, #13, '', [rfReplaceAll]);
  end;

begin
  fmMain.MyScript.SQL.Text := 'TRUNCATE TABLE goods';
  fmMain.MyScript.Execute;

  adoImport.Close;
  adoImport.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+
    fmMain.dlgOpenGoods.FileName+
    ';Mode=ReadWrite|Share Deny None;Extended Properties=Excel 8.0;Persist Security Info=False';

  adoImport.SQL.Text := 'SELECT * FROM ['+lbTables.Items[0]+']';
  adoImport.Open;

  sTemp := '';
  try
    while not adoImport.Eof do
    begin
      sTemp := sTemp +
        #9+adoImport.FieldByName('Код').AsString+#9+
        adoImport.FieldByName('Производитель').AsString+#9+
        adoImport.FieldByName('Модель').AsString+#9+
        adoImport.FieldByName('Артикул').AsString+#9+
        FixString(adoImport.FieldByName('Описание').AsString)+#9+
        adoImport.FieldByName('Кол-во').AsString+#9+
        //TODO: проверить
        {SysUtils.StringReplace(
          adoImport.FieldByName('Розн#цена').AsString), ',', '.', [rfReplaceAll]),}
        adoImport.FieldByName('Розн#цена').AsString+#9+
        adoImport.FieldByName('Информация').AsString+#9+
        adoImport.FieldByName('Гарантия').AsString+#10;
      adoImport.Next;
    end;

    sToFile := TStringStream.Create(sTemp, 1252);
    sToFile.SaveToFile(ExtractFilePath(Application.ExeName)+'import.txt');

    fmMain.MyScript.SQL.Text := 'LOAD DATA INFILE '''+
     fmMain.ScreenSpecs(ExtractFilePath(Application.ExeName)+'import.txt')+''' INTO TABLE goods';
    fmMain.MyScript.Execute;

    ShowMessage('Новый список товаров был успешно импортирован!');
  finally
    sToFile.Free;
  end;
end;

Я знаю, какой файл создает MySQL, и мне нужно создать такой файл Delphi. В справке MySQL эта кодировка называется «двоичный набор символов», так как я могу сохранить файл в этой кодировке Delphi?

1 Ответ

1 голос
/ 24 июня 2011

load data infile отлично загрузит ваши символы кириллицы.

Убедитесь, что CSV-файл, из которого вы читаете, использует юникод и правильно отображает символы.
Убедитесь, что поля базы данных, в которую вы читаете, имеют правильную кодировку. Я предлагаю UTF8 с кириллицей.

Затем убедитесь, что ваше соединение с базой данных (!) Использует UTF8, в противном случае эти символы будут мутированы в транспорте.

Сделайте это, и load data infile должно работать.

Вот как читать данные из кириллицы в MySQL: Как импортировать учебник (книгу) UTF8 в таблицу MySQL / Простое пошаговое руководство по импорту книг в MySQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...