我有一个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)编码。默认-然后它像我在这个例子中所说的那样显示:“Aa Cc Ee Ll NnóSs Zz Zz”。
2)Encoding.ASCII-然后它显示所有“?”字符
3)Encoding.UTF8-但它显示所有“?”角色也是。
4)Encoding.GetEncoding(1252)-没有太大帮助。
至于mysql数据库,我已经设置了比较字幕的方法。
现在,我该如何导入带有波兰字符的csv。可能需要更改导入csv文件代码的第一部分中的代码行:
using(StreamReader sr = new StreamReader(excel, Encoding.Default))

有什么想法吗?
编辑
我使用phpmyadmin 4.8.4,mysql数据库版本是10.1.37-MariaDB

最佳答案

你至少要检查四件事:
是否正确加载字符?使用Visual Studio调试器并检查Encoding.Defaultline变量的值。
可能的修复方法:将文件保存为UTF-8并使用fields
你的数据库能存储这些字符吗?使用MySQL Workbench执行Encoding.UTF8(根据需要添加其他列)。
可能的修复方法:将列类型声明为INSERT INTO try1.workers(LNAME) VALUES('ĄąĆćĘꣳŃńÓ󌜏źŻż'); SELECT * FROM try1.workers;
是否将Unicode发送到数据库?在插入值之后,使用MySQL工作台从表中选择值并检查它们是否正确。
可能的解决方法:将utf8mb4_unicode520_ci添加到连接字符串,或切换到MySqlConnector以始终通过网络发送Unicode数据。
phpmyadmin在检索数据时是否损坏了您的数据?如果其他一切看起来都是正确的,那么可能就是问题所在。
可能的解决方法:再问一个SO问题(或者编辑这个问题),把注意力放在这个问题上,而不是放在C#+MySQL上。

关于c# - 导入CSV到MySQL数据库-如何读取波兰语字符的文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56984570/

10-11 03:17
查看更多