Создание строк, которые могут включать символы utf-8, безопасные для MySQL в C # .Net - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть программа, написанная на 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, он в основном говорил INSERT запись со строкой вроде '\ xE2 \ x84 \ x85 ... "плюс остальная часть строки.

Очевидно, что я не контролирую, что Amazon будет разрешать в полях адреса доставки, поэтому мне нужно учитывать любые странные символы, которые могут появиться, но я понятия не имею, как это сделать. Я надеялся, что просто использование utf8 в моей строке соединения (charset = utf8;) исправит это, но это ничего не сделало - все равно была та же ошибка. Возможно, мне не хватает моих навыков работы с Google, но я не могу найти способ разрешить появление каких-либо странных символов, которые могут появиться на моем пути, и я не хочу ждать, пока кто-нибудь напечатает его, чтобы исправить ошибку.

UPDATE:

Как насчет отправки "SET NAMES utf8" в качестве запроса? Это своего рода знание моего MySQL, и я не хочу ничего портить, но сработает ли это? И если да, то будут ли все программы, которые у меня есть, которые используют эту базу данных, отправлять этот же запрос?

ОБНОВЛЕНИЕ 2: Для тех, кто продолжает запрашивать сообщение об ошибке исключения, это:

«MySql.Data.MySqlClient.MySqlException» произошло в MySql.Data.dll Дополнительная информация: Неверное строковое значение: '\ xE2 \ x84 \ x85 Yo ...' для столбца 'ShipAddressLine2' в строке 1

ОБНОВЛЕНИЕ 3: Из этого обсуждения: SET NAMES utf8 в MySQL? Я попытался отправить «SET NAMES 'cp1250'», и я был удивлен, увидев, что это позволило вставке пройти через символ ℅ там. Я понимаю, что, возможно, если до того, как я получу информацию, которую я посылаю "SET CHARSET 'utf8'" в качестве запроса перед другим запросом MySQL, чтобы получить его, возможно, я получу правильный символ? Я воодушевлен тем, что он прошел через мою программу, отправив запрос «SET NAMES 'cp1250'», но я хочу знать, какой набор кодировки использовать (CP1250 - восточноевропейский, и хотя у нас есть клиенты со всего мира, большинство наших клиенты находятся в Соединенных Штатах), и убедитесь, что это правильная практика, прежде чем я перейду на изменение всех своих программ, чтобы включить это. Кто-нибудь?

1 Ответ

0 голосов
/ 15 сентября 2018

В случае, если у кого-то еще есть эта проблема, мне сначала удалось избежать ошибки, отправив команду MySQL: SET NAMES 'latin1' на сервер перед сохранением данных. Это позволяет хранить любой из символов utf8, не вызывая ошибки MySQL (я проверил это с несколькими нечетными символами). Это, однако, сохранило символы utf8 в загадочном формате, поэтому я собираюсь дать лучший ответ ниже:

В моем текущем решении я отредактировал таблицу MySQL и изменил набор символов для соответствующего столбца, который может принимать данные utf8. Я изменил набор символов столбца на utf8mb4, а сопоставление столбца - utf8mb4_general_ci. Это позволило правильно хранить данные, чтобы символы utf8 были правильными.

Кроме того, при настройке строки подключения я добавил charset = utf8mb4;.

string MyConString = "SERVER=*****;" + "DATABASE=******;" + "UID=********;" + "PASSWORD=*********;" + "charset = utf8mb4;" ;

хотя, насколько я могу судить, он сохраняет содержимое в поле так же, независимо от того, включаю я параметр charset = или нет.

...