将 csv 导入 mysql 数据库 - 如何读取包含波兰语字符的文件?
importing csv to mysql database - how to read file with Polish characters?
我有一个 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
在 try1.workers
table 中使您的列 NVARCHAR
接受 Unicode 字符而不是仅接受 ASCII。
您(至少)有四件事要检查:
Encoding.Default
加载字符是否正确?使用 Visual Studio 调试器并检查 line
和 fields
变量的值。
- 可能的修复:将文件另存为 UTF-8 并使用
Encoding.UTF8
。
- 你的数据库能存储这些字符吗?使用 MySQL Workbench 执行
INSERT INTO try1.workers(LNAME) VALUES('ĄąĆćĘꣳŃńÓóŚśŹźŻż'); SELECT * FROM try1.workers;
(根据需要添加其他列)。
- 可能的修复:将列类型声明为
utf8mb4_unicode520_ci
。
- 是否
cmd.ExecuteNonQuery
向数据库发送Unicode?插入后使用 MySQL Workbench 到 select 来自 table 的值并检查它们是否正确。
- 可能的修复:将
CharSet=utf8mb4
添加到您的连接字符串,或切换到 MySqlConnector,后者始终通过网络发送 Unicode 数据。
- phpmyadmin 是否在检索数据时损坏了您的数据?如果其他一切看起来都正确,则可能是问题所在。
- 可能的修复:提出另一个 SO 问题(或编辑此问题)以完全关注该问题,而不是 C# + MySQL。
我有一个 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
在 try1.workers
table 中使您的列 NVARCHAR
接受 Unicode 字符而不是仅接受 ASCII。
您(至少)有四件事要检查:
Encoding.Default
加载字符是否正确?使用 Visual Studio 调试器并检查line
和fields
变量的值。- 可能的修复:将文件另存为 UTF-8 并使用
Encoding.UTF8
。
- 可能的修复:将文件另存为 UTF-8 并使用
- 你的数据库能存储这些字符吗?使用 MySQL Workbench 执行
INSERT INTO try1.workers(LNAME) VALUES('ĄąĆćĘꣳŃńÓóŚśŹźŻż'); SELECT * FROM try1.workers;
(根据需要添加其他列)。- 可能的修复:将列类型声明为
utf8mb4_unicode520_ci
。
- 可能的修复:将列类型声明为
- 是否
cmd.ExecuteNonQuery
向数据库发送Unicode?插入后使用 MySQL Workbench 到 select 来自 table 的值并检查它们是否正确。- 可能的修复:将
CharSet=utf8mb4
添加到您的连接字符串,或切换到 MySqlConnector,后者始终通过网络发送 Unicode 数据。
- 可能的修复:将
- phpmyadmin 是否在检索数据时损坏了您的数据?如果其他一切看起来都正确,则可能是问题所在。
- 可能的修复:提出另一个 SO 问题(或编辑此问题)以完全关注该问题,而不是 C# + MySQL。