لقد تعلمت JDBC منذ بعض الوقت وتواصل مع MySQL للحصول على البيانات. وفقًا لبيانات عينة المعلم ، اضطررت إلى حفظ بعض المعلومات مثل الأسماء ، وكانوا جميعًا باللغة الإنجليزية. لم أكن أرغب في استخدام اللغة الإنجليزية في ذلك الوقت ، لذلك أنقذت اسم زميلتي في الغرفة. هههه ، نتيجة لذلك ، حدث خطأ ما.
الاتصال ببيان قاعدة البيانات:
Static Final String db_url = "jdbc: mysql: // localhost/filemanagement" ؛
بيان الاستعلام:
السلسلة النهائية الثابتة الخاصة theUserquery = "حدد الاسم ، كلمة المرور ، دور من userInfo أين الاسم =؟" ؛
أنا أستخدم اسمي للاستعلام ، NullPointerException ، من الواضح أنه لم يتم العثور على بيانات مقابلة مع اسمي ، وهي موجودة في قاعدة البيانات. لماذا هذا؟
الجواب من Baidu هو رمز مشوهة الصينية. الحل هو تعديل عبارة قاعدة بيانات الاتصال إلى:
Static Final String db_url = "jdbc: mysql: // localhost/fileManagement؟ useUnicode = true & directionoding = gbk" ؛
حاول ثانية!
لا بأس! ولكن لماذا هذا؟ ما هي هاتين المعلمتين؟ لماذا تم حل المشكلة بعد إضافتها؟
يتم شرح هاتين المعلمتين على النحو التالي:
القيم الافتراضية لكلا المعلمات خاطئة. بمعنى آخر ، عندما نحدد مجموعة الأحرف المستخدمة للاتصال عند توصيل MySQL ، يكون كل شيء طبيعيًا. لكنني ما زلت لا أعرف الكثير عن الآلية ، لذلك ما زلت أتحقق من ذلك.
اتضح أن هناك عملية تحويل مجموعة الأحرف عندما يقوم اتصال MySQL بالاستعلام والعمليات الأخرى:
1. عندما يتلقى خادم MySQL الطلب ، يقوم بتحويل بيانات الطلب من الحرف _set_client إلى الحرف _set_connection ؛
2. قبل إجراء العمليات الداخلية ، قم بتحويل البيانات المطلوبة من الحرف _SET_CONNECTION إلى مجموعة أحرف التشغيل الداخلية. طريقة التحديد هي كما يلي:
• استخدم قيمة إعداد تعيين الأحرف لكل حقل بيانات ؛
• إذا كانت القيمة أعلاه غير موجودة ، فاستخدم قيمة إعداد تعيين الأحرف الافتراضية (امتداد MySQL ، المعيار غير SQL) لجدول البيانات المقابل ؛
• إذا كانت القيمة أعلاه غير موجودة ، فسيتم استخدام قيمة تعيين مجموعة الأحرف الافتراضية لقاعدة البيانات المقابلة ؛
• إذا كانت القيمة أعلاه غير موجودة ، فاستخدم حرف _SET_SERVER لتعيين القيمة.
3. قم بتحويل نتيجة العملية من تم تعيين حرف التشغيل الداخلي إلى الحرف _set_results.
ماذا تمثل مجموعات الشخصيات هذه؟
حرف _set_server: مجموعة أحرف التشغيل الداخلية الافتراضية
حرف _set_client: مجموعة الأحرف المستخدمة بواسطة بيانات مصدر العميل
حرف _set_connection: مجموعة أحرف طبقة الاتصال
حرف _set_results: مجموعة أحرف نتائج الاستعلام
حرف _set_database: مجموعة الأحرف الافتراضية لقاعدة البيانات المحددة حاليًا
الحرف _set_system: Metadata (اسم الحقل ، إلخ) مجموعة الأحرف
كما وجدت بعض الأسئلة الشائعة. على الرغم من أنها مختلفة عن لي ، إلا أنها ذات قيمة مرجعية رائعة.
• قبل إدخال البيانات المشفرة UTF8 في جدول بيانات مع مجموعة الأحرف الافتراضية هو UTF8 ، مجموعة حرف الاتصال هي UTF8.
عند الإدراج ، وفقًا للإعدادات الافتراضية لخادم MySQL ، الحرف inset_client ، الحرف _connection و former_set_results هي latin1 ؛
سوف تمر بيانات عملية الإدراج من خلال عملية تحويل مجموعة الأحرف لـ LATIN1 => LATIN1 => UTF8. خلال هذه العملية ، سيتم حفظ كل شخصية صينية مدرجة من البايت 3 الأصلي إلى 6 بايت ؛
ستمر النتيجة أثناء الاستعلام بعملية تحويل مجموعة الأحرف لـ UTF8 => UTF8 ، ويتم إرجاع البايتات 6 المحفوظة سليمة ، مما يؤدي إلى رمز مشهور ...
• قم بتعيين حرف الاتصال على UTF8 قبل إدخال البيانات المشفرة UTF8 في جدول بيانات مع مجموعة الأحرف الافتراضية هي LATIN1.
عند إدخال ، character_set_client ، character_set_connection و farks_set_results كلها utf8 ؛
سيتم تحويل بيانات الإدراج من خلال مجموعة حرف UTF8 => UTF8 => LATIN1. إذا كانت البيانات الأصلية تحتوي على أحرف Unicode غير /u0000 ~ /u00ff ، فسيتم تحويلها إلى "؟" (0x3F) رمز لأنه لا يمكن تمثيله في مجموعة الأحرف من LATIN1. في المستقبل ، بغض النظر عن مجموعة حرف الاتصال ، لا يمكن استعادة محتوىه.
(هذا الجزء مقتطف من مدونة Brother Bird ، ويتم إرفاق الرابط لاحقًا)
يتم تعيين الجداول الموجودة في قاعدة البيانات الخاصة بي مع ترميز UTF8 ، لكن عندما قمت بالاتصال لأول مرة ، لم أتعريب مجموعة حرف الاتصال ، وبالتالي فإن الافتراضي هو LATIN1. بعد التحويل من UTF8 => LATIN1 ، يتم إنشاء رمز مشتعل. ترميز GBK الذي استخدمته للمرة الثانية ، ولم أستخدم ترميز UTF8. لماذا هو جيد؟ في الواقع ، إنه نفس الشيء. الصينية ليست في الترميز Latin1 ، ولكن في GBK و UTF8 ، لذلك لن تكون هناك مشاكل.
ما سبق هو الحل لاستثناء اتصال JDBC المشوه بـ MySQL. إذا كان لا يزال لديك أي أسئلة ، فيمكنك مناقشتها في منطقة التعليق أدناه.