using MySql.Data.MySqlClient;A:连接问题。连接MySQL数据库,连接字符串如下:
"Persist Security Info=no;Data Source={0};Port={1};Database={4};User Id={2};Password={3};charset=utf-8;Connect Timeout=120";
在WebForm下可以连接,但是在WinForm下出错:Unknown character set: 'utf'B:乱码问题
MySQL中使用了默认的字符集(latin1?),读取数据时,有中文的话,得到乱码
注:不能修改MySql的配置
在网上找了一个方法,对读出的字符串进行处理,代码如下DataTable DealTable_Str(DataTable gDataTable)
{
DataTable xReturn = gDataTable;
if (xReturn == null)
{
return xReturn;
}
if (xReturn.Rows.Count == 0)
{
return xReturn;
}
try
{
string[] xName = GetStringField(xReturn);
if (xName != null && xName.Length > 0)
{
for (int i = 0; i < xReturn.Rows.Count; i++)
{
for (int j = 0; j < xName.Length; j++)
{ if (xReturn.Rows[i][xName[j]] != null && !(Convert.IsDBNull(xReturn.Rows[i][xName[j]])))
{
string y = (string)(xReturn.Rows[i][xName[j]]);
if (y != "")
{
byte[] buf = System.Text.Encoding.GetEncoding(28591).GetBytes(y);
y = System.Text.Encoding.Default.GetString(buf);
xReturn.Rows[i][xName[j]] = y;
}
}
}
}
} }
catch
{
} return xReturn;
}
String[] GetStringField(DataTable gDataTable)
{
string[] xReturn = null;
DataTable xDT = gDataTable;
if (xDT == null)
{
return xReturn;
}
if (xDT.Rows.Count == 0)
{
return xReturn;
}
try
{
string xCol = "";
for (int i = 0; i < xDT.Columns.Count; i++)
{ Type xType = xDT.Columns[i].DataType;
if (xType == typeof(string))
{
//byte[] buf = System.Text.Encoding.GetEncoding(28591).GetBytes(xDT.Columns[i].ColumnName);
//xDT.Columns[i].ColumnName = System.Text.Encoding.Default.GetString(buf);
xCol += "|" + xDT.Columns[i].ColumnName;
}
}
if (xCol.Length > 0)
{
xCol = xCol.Remove(0, 1);
}
xReturn = xCol.Split('|');
}
catch
{
xReturn = null;
}
return xReturn;
}核心语句也就是
byte[] buf = System.Text.Encoding.GetEncoding(28591).GetBytes(y);
y = System.Text.Encoding.Default.GetString(buf);
对读出的数据进行转换,在WebFrom下可以,但是有一个问题,有时读不到数据,需要刷新才能看到结果。
将问题A中的连接字符串改为charset=utf8,则WinForm可以连接上,也能得到数据,对于普通的中英文没有什么问题,但是当内容中有特殊的字符串时,就得不到正确的查询值了,比如:◇﹎儍咾嘙﹏多谢指点!
"Persist Security Info=no;Data Source={0};Port={1};Database={4};User Id={2};Password={3};charset=utf-8;Connect Timeout=120";
在WebForm下可以连接,但是在WinForm下出错:Unknown character set: 'utf'B:乱码问题
MySQL中使用了默认的字符集(latin1?),读取数据时,有中文的话,得到乱码
注:不能修改MySql的配置
在网上找了一个方法,对读出的字符串进行处理,代码如下DataTable DealTable_Str(DataTable gDataTable)
{
DataTable xReturn = gDataTable;
if (xReturn == null)
{
return xReturn;
}
if (xReturn.Rows.Count == 0)
{
return xReturn;
}
try
{
string[] xName = GetStringField(xReturn);
if (xName != null && xName.Length > 0)
{
for (int i = 0; i < xReturn.Rows.Count; i++)
{
for (int j = 0; j < xName.Length; j++)
{ if (xReturn.Rows[i][xName[j]] != null && !(Convert.IsDBNull(xReturn.Rows[i][xName[j]])))
{
string y = (string)(xReturn.Rows[i][xName[j]]);
if (y != "")
{
byte[] buf = System.Text.Encoding.GetEncoding(28591).GetBytes(y);
y = System.Text.Encoding.Default.GetString(buf);
xReturn.Rows[i][xName[j]] = y;
}
}
}
}
} }
catch
{
} return xReturn;
}
String[] GetStringField(DataTable gDataTable)
{
string[] xReturn = null;
DataTable xDT = gDataTable;
if (xDT == null)
{
return xReturn;
}
if (xDT.Rows.Count == 0)
{
return xReturn;
}
try
{
string xCol = "";
for (int i = 0; i < xDT.Columns.Count; i++)
{ Type xType = xDT.Columns[i].DataType;
if (xType == typeof(string))
{
//byte[] buf = System.Text.Encoding.GetEncoding(28591).GetBytes(xDT.Columns[i].ColumnName);
//xDT.Columns[i].ColumnName = System.Text.Encoding.Default.GetString(buf);
xCol += "|" + xDT.Columns[i].ColumnName;
}
}
if (xCol.Length > 0)
{
xCol = xCol.Remove(0, 1);
}
xReturn = xCol.Split('|');
}
catch
{
xReturn = null;
}
return xReturn;
}核心语句也就是
byte[] buf = System.Text.Encoding.GetEncoding(28591).GetBytes(y);
y = System.Text.Encoding.Default.GetString(buf);
对读出的数据进行转换,在WebFrom下可以,但是有一个问题,有时读不到数据,需要刷新才能看到结果。
将问题A中的连接字符串改为charset=utf8,则WinForm可以连接上,也能得到数据,对于普通的中英文没有什么问题,但是当内容中有特殊的字符串时,就得不到正确的查询值了,比如:◇﹎儍咾嘙﹏多谢指点!
就只能修改你的编码解析的代码了
up
y = System.Text.Encoding.Default.GetString(buf); 转字节不能也用System.Text.Encoding.Default.GetBytes吗