我有一个用c#.net编写的程序,可以下载我们的amazon.com订单,并将它们存储在本地数据库中。
我遇到了一个问题,购买产品的客户输入了utf8字符(℅) - (\xe2\x84\x85)输入地址。这似乎是一个相当合理的做法,但我的程序阻塞时,它运行了这个命令,直到我在下面的修复。
//get the Address2 subnode
XmlNode Address2Node = singleOrder.SelectSingleNode("ShippingAddress/AddressLine2");
if (Address2Node != null)
{
GlobalClass.Address2 = Address2Node.InnerXml;
//**c/o Unicode character messed up program.
if (GlobalClass.Address2.Contains("℅"))
{
GlobalClass.Address2 = GlobalClass.Address2.Replace("℅", "c/o");
// Console.WriteLine(GlobalClass.Address2.Substring(0,1));
}
GlobalClass.Address2 = GlobalClass.Address2.Replace("'", "''");
}
else
{
GlobalClass.Address2 = "";
}
显然,这只适用于这个字段和这个utf8字符。如果没有这个修复,当我尝试使用mysql插入它时,我收到了一条错误消息,基本上相当于我的mysql语句中有一个错误,当它被发送到mysql时,它基本上是说插入一个字符串,如“\xe2\x84\x85…”加上其余的字符串。
很明显,我无法控制amazon将在shipping address字段中允许什么,所以我需要说明可能出现的任何奇怪字符,但我不知道如何做到这一点。我希望在我的连接字符串中只允许utf8(charset=utf8;)会修复它,但那没有做任何事-仍然有相同的错误。也许我的谷歌技能是缺乏的,但我似乎找不到一种方法来允许任何奇怪的字符,可能会来我的方式,我不想等到有人键入它来修复错误。
更新:
作为查询发送“set names utf8”怎么样?这有点超出了我的mysql知识范围,我不想搞砸任何事情,但这行得通吗?如果是的话,所有使用这个数据库的程序都需要发送相同的查询吗?
更新2:对于那些不断请求异常错误消息的人,它是:
“mysql.data.mysqlclient.mysqlexception”出现在mysql.data.dll中其他信息:第1行“shipaddressline2”列的字符串值“\xe2\x84\x85 yo…”不正确
更新3:从这个讨论:在mysql中设置名称utf8?我试着发送“set names'cp1250'”,我惊讶地发现这使得insert可以通过℅ 里面的人物。我推测,如果在我检索信息之前,我将“set charset'utf8'”作为一个查询发送给另一个mysql查询来检索它,那么也许我会得到正确的字符?我很高兴它通过我的程序发送了“set names'cp1250'”查询,但我想知道要使用什么编码集(cp1250是东欧的,虽然我们有来自全球的客户,我们的大多数客户都在美国),在我改变我的所有程序以包括这一点之前,请确保这是合理的做法。有人吗?
1条答案
按热度按时间tf7tbtn21#
如果其他人有这个问题,我首先通过发送mysql命令来避免这个错误:在存储数据之前将names'latin1'设置到服务器。这允许存储任何utf8字符而不会导致mysql错误(我用几个奇数字符测试了它)。但是,它以一种神秘的格式存储了utf8字符,因此我将在下面给出一个更好的答案:
在我当前的解决方案中,我编辑了mysql表并更改了可能接收utf8数据的相关列的字符集。我将列的字符集更改为utf8mb4,并将列的排序规则更改为utf8mb4\u general\u ci。这样可以正确存储数据,以便utf8字符是正确的。
另外,在设置连接字符串时,我添加了charset=utf8mb4;。
不过,据我所知,无论是否包含charset=参数,它都会将内容保存到字段中。