【问题标题】:importing csv to mysql database - how to read file with Polish characters?将 csv 导入 mysql 数据库 - 如何读取带有波兰语字符的文件?
【发布时间】:2019-11-20 21:35:15
【问题描述】:

我有一个 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");
}

我在 mysql 数据库中的“LNAME”列中看到并非所有波兰字符:“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

【问题讨论】:

    标签: c# mysql .net csv polish


    【解决方案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。

    【讨论】:

    • 我检查了您提供的内容并将CharSet=utf8mb4 添加到我的连接字符串中,它可以正常工作。谢谢!
    【解决方案2】:

    try1.workers 表中的NVARCHAR 列设为接受Unicode 字符而不是仅接受ASCII。

    【讨论】:

    • 因为我不明白我已将数据库中的列从 utf8_polish_ci 更改为 utf8mb4_polish_ci 并且我的代码没有更改。但它没有奏效,因为我有'?字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2011-10-05
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多