1

我有一个 csv 文件,它也有波兰语字符。这个的内容在这里:

ID_WORKER;FNAME;LNAME;WORKERS_GROUP;POSITION;
1;Paweł;ĄąĆćĘꣳŃńÓ󌜏źŻż;IT;IT Specialist;
6;Dawid;ĄąĆćĘꣳŃńÓ󌜏źŻż;Technologists;Technologists;
8;Maciej;ĄąĆćĘꣳŃńÓ󌜏źŻż;Storekeepers;Storekeeper;

如您所见,它有这些字符,例如“Ąą Ćć Ęę Łł Ńń Óó Śś Źź Żż”。然后我使用以下代码导入 csv 文件:

private DataTable ImportFile()
{
    DataTable imported_data = new DataTable();

    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Title = "Open csv file";
    ofd.DefaultExt = "*.csv";
    ofd.Filter = "Documents (*.csv)|*.csv";
    ofd.ShowDialog();

    FileInfo fi = new FileInfo(ofd.FileName);
    string FileName1 = ofd.FileName;
    string excel = fi.FullName;

    using(StreamReader sr = new StreamReader(excel, Encoding.Default))
    {
        string header = sr.ReadLine();
        if (string.IsNullOrEmpty(header))
        {
            MessageBox.Show("Not found or loaded not correct file.");
            return null;
        }

        string[] header_columns = header.Split(',');
        foreach(string header_column in header_columns)
        {
            imported_data.Columns.Add(header);
        }

        while (!sr.EndOfStream)
        {
            string line = sr.ReadLine();

            if (string.IsNullOrEmpty(linia)) continue;

            string[] fields = line.Split(',');
            DataRow imported_row = imported_data.NewRow();

            for (int i = 0; i < fields.Count(); i++)
            {
                imported_row[i] = fields[i];
            }

            imported_data.Rows.Add(imported_row);
        }
    }
    return imported_data;
}

当我使用下面的代码将包含所有内容的导入数据从 csv 文件插入数据库时​​:

private void save_modules(DataTable imported_data)
{
    string connection = "datasource=localhost;port=3306;username=root;password=";
    using (MySqlConnection conn = new MySqlConnection(connection))
    {
        conn.Open();
        foreach (DataRow importRow in imported_data.Rows)
        {
            string query = @"INSERT IGNORE INTO try1.workers (ID_WORKER, FNAME, LNAME,
            WORKERS_GROUP, POSITION) VALUES (@ID_WORKER, @FNAME, @LNAME,
            @WORKERS_GROUP, @POSITION);";

            MySqlCommand cmd = new MySqlCommand(query, conn);

            cmd.Parameters.AddWithValue("@ID_WORKER", importRow["ID_WORKER"]);
            cmd.Parameters.AddWithValue("@FNAME", importRow["FNAME"]);
            cmd.Parameters.AddWithValue("@LNAME", importRow["LNAME"]);
            cmd.Parameters.AddWithValue("@WORKERS_GROUP", importRow["WORKERS_GROUP"]);
            cmd.Parameters.AddWithValue("@POSITION", importRow["POSITION"]);

            cmd.ExecuteNonQuery();
        }
        conn.Close();
    }  
    MessageBox.Show("Imported to database");
}

我在“LNAME”列中的 mysql 数据库中看到并非所有波兰字符:“Aa Cc Ee Ll Nn Óó Ss Zz Zz”。这还不够好。

我试过什么?

我尝试使用其他编码格式导入 csv 文件:

1) Encoding.Default - 然后它像我在这个例子中展示的那样显示:“Aa Cc Ee Ll Nn Óó Ss Zz Zz”。

2)Encoding.ASCII - 然后它显示所有'?人物

3) Encoding.UTF8 - 但它显示所有“?” 字符也。

4) Encoding.GetEncoding(1252) - 没有太大帮助。

至于mysql数据库,我已经设置utf8_polish_ci了比较字幕的方法。

现在,我如何使用波兰字符导入 csv。可能需要在导入 csv 文件代码的第一段中更改代码行:

using(StreamReader sr = new StreamReader(excel, Encoding.Default)) 

有任何想法吗?

编辑

我使用phpmyadmin 4.8.4和 mysql 数据库版本是10.1.37-MariaDB

4

2 回答 2

1

你有(至少)四件事要检查:

  • 是否Encoding.Default正确加载字符?使用 Visual Studio 调试器并检查linefields变量的值。
    • 可能的修复:将文件另存为 UTF-8 并使用Encoding.UTF8.
  • 您的数据库可以存储这些字符吗?使用 MySQL Workbench 执行INSERT INTO try1.workers(LNAME) VALUES('ĄąĆćĘꣳŃńÓ󌜏źŻż'); SELECT * FROM try1.workers;(根据需要添加其他列)。
    • 可能的修复:将列类型声明为utf8mb4_unicode520_ci.
  • 是否cmd.ExecuteNonQuery将 Unicode 发送到数据库?插入后使用 MySQL Workbench 从表中选择值并检查它们是否正确。
    • 可能的修复:添加CharSet=utf8mb4到您的连接字符串,或切换到始终通过网络发送 Unicode 数据的MySqlConnector 。
  • phpmyadmin 在检索数据时是否损坏了您的数据?如果其他一切看起来都正确,那么可能就是问题所在。
    • 可能的修复:询问另一个 SO 问题(或编辑这个问题)以完全关注该问题,而不是 C# + MySQL。
于 2019-07-11T13:58:28.640 回答
0

NVARCHAR使表中的yur 列try1.workers接受 Unicode 字符,而不是仅接受 ASCII。

于 2019-07-11T08:17:14.493 回答