سؤال

يمكن لقاعدة بيانات MySQL تخزين رمز اليورو على ما يرام (كما تم اختباره مع عميل MySQL الأصلي (Heidisql)). ولكن مع موصل MySQL .NET Connector الخاص بي يستخدم تطبيق ASP.NET الخاص بي، لا يمكنني إدراجها ولا قرأتها مرة أخرى من قاعدة البيانات: أحصل فقط على؟ حرف الظهر. ما يمكن أن يكون السبب المحتمل؟

هل كانت مفيدة؟

المحلول

أود أن أقترح بشكل صريح تحديد الترميز في سلسلة الاتصال الخاصة بك:

خادم = localhost؛ قاعدة البيانات = مخطط؛ uid = foo؛ pwd = bar؛Charset = UTF8.;

وعادة ما يحل معظم المشكلات المتعلقة بالترميز مع موصل MySQL / NET.

نصائح أخرى

أود أن أقول أن موصل MySQL .NET يحدد بعض متغيرات البيئة المرتبطة بالترتيب على اتصال؛ مقارنة إخراج هذه الاستفسارات على حد سواء في Heidisql و .NET:

SHOW VARIABLES LIKE "character_set_%"; 
SHOW VARIABLES LIKE "collation_%";

يجب أن تحتوي جميعها على شيء UTF8. إذا لم يكن كذلك، يمكنك تغييرها في وقت التشغيل كما هو الحال في الدليل.

يمكن أن يشفر الأمر .NET التالي هذه قاعدة البيانات الخاصة بك، ثم فك شفرةها في الرمز الأصلي ...

System.Web.HttpUtility.HtmlEncode()

System.Web.HttpUtility.HtmlDecode()

من المفترض أنك تقوم بإدراجك في تسجيل الدخول إلى حقل يتم كتابته باسم NVARCHAR أو أنك لن تتمكن من إدراج وتستعد علامة اليورو بشكل صحيح مع العملاء الآخرين؟

هل تستخدم بناء الجملة الصحيح في عبارات SQL الخاصة بك لإدراج واسترجاع بيانات Unicode؟

للقيام بذلك، يجب عليك استخدام حرف معلومات N قبل أي سلسلة هي Unicode أو سيتم تحويلها بصمت إلى ترميز بايت واحد وتصبح حرفا غير قابل للقراءة على سبيل المثال

//Inserting Unicode data
MySqlCommand cmd = new MySqlCommand();
cmd.CommandText = "INSERT INTO SOME_TABLE (someField) VALUES (N'@text')";
cmd.Parameters.Add("text", "Some Unicode Text");
cmd.Connection = conn;
cmd.ExecuteNonQuery();

//Selecting Unicode data
MySqlCommand select = new MySqlCommand();
select.CommandText = "SELECT * FROM SOME_TABLE WHERE someField=N'@text'";
cmd.Parameters.Add("text", "Some Unicode Text");
cmd.Connection = conn;
//Execute your query and process your Results...

تلقيت مشكلة مماثلة، في محاولة لاستيراد البيانات من Sybase 12.5 إلى MS SQL Server 2005.

أساسا MSSQL Stores £ و Euro علامات على ما يرام في Varchar إذا تم تشفيرها بشكل صحيح، وهو أمر رائع، ولكن ما لم أكن أدركه هو أن Sybase كانت إخراج البيانات ك Windows-1252 (غرب أوروبا) وليس UTF-8 وهذا تسبب بيانات مثل £ ورمز اليورو للحصول على ترجمة برنامج الاستيراد باسم "؟". إخبار برنامج الاستيراد أن يتم ترميز البيانات الواردة ك 1252 تم إصلاح المشكلة.

إذا قمت بتشفير الإخراج من DB AS 1252 كما تقرأه، يجب عليك الحصول على الرموز الصحيحة.

علي سبيل المثال:

System.Text.Encoding enc = System.Text.Encoing.GetEncoding(1252);
MySqlDataReader msdr = command.ExecuteReader();
while(msdr.Read())
{
    ...
    string val = enc.GetString(enc.GetBytes(msddr.GetString(mssdr.GetOrdinal("varhcar_field"))));
    ...
}

هل قمت بتعيين Charset بشكل صحيح في صفحة الإخراج الخاصة بك؟ أي شيء مثل <META http-equiv="Content-Type" content="text/html; charset=UTF-8">أو charset=iso-8859-15 لكن لا charset=iso-8859-1

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top