【问题标题】:Delphi and binary character set (for MySQL)Delphi 和二进制字符集(用于 MySQL)
【发布时间】:2011-09-21 16:59:52
【问题描述】:

我需要将大 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 如何以这种编码保存文件?

【问题讨论】:

    标签: mysql delphi encoding


    【解决方案1】:

    load data infile 会很好地加载您的西里尔字符。

    确保您正在读取的 csv 文件使用 unicode 并正确显示字符。
    确保您正在读取的数据库字段具有正确的编码。我建议使用西里尔语排序规则的 UTF8。

    接下来确保您的数据库连接 (!) 使用 UTF8,否则这些字符会在传输过程中发生变异。

    这样做,load data infile 应该可以工作。

    以下是将西里尔文数据读入 MySQL 的方法:Howto import a UTF8 textbook (book) in MySQL table / A simple step by step guide through on howto import books in MySQL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多