Saya belajar JDBC beberapa waktu yang lalu dan terhubung ke MySQL untuk mendapatkan data. Menurut data sampel guru, saya harus menyimpan beberapa informasi seperti nama, dan semuanya dalam bahasa Inggris. Saya tidak ingin menggunakan bahasa Inggris pada saat itu, jadi saya menyimpan nama teman sekamar saya. Hehe, sebagai hasilnya, ada yang salah.
Hubungkan ke Pernyataan Basis Data:
string final statis db_url = "jdbc: mysql: // localhost/filemanagement";
Pernyataan kueri:
string final statis pribadi TheUserQuery = "Pilih Nama, Kata Sandi, Peran dari UserInfo Where Name =?";
Saya menggunakan nama saya untuk meminta, nullpointerexception, jelas bahwa tidak ada data yang sesuai ditemukan dengan nama saya, dan itu ada di database. Mengapa ini?
Jawaban dari Baidu adalah kode kacau Cina. Solusinya adalah memodifikasi pernyataan basis data koneksi menjadi:
string final statis db_url = "jdbc: mysql: // localhost/filemanagement? useunicode = true & characterencoding = gbk";
Coba lagi!
Tidak apa-apa! Tapi kenapa ini? Apa dua parameter itu? Mengapa masalah diselesaikan setelah menambahkannya?
Dua parameter ini dijelaskan sebagai berikut:
Nilai default untuk kedua parameter itu salah. Dengan kata lain, ketika kami menentukan set karakter yang digunakan untuk koneksi saat menghubungkan MySQL, semuanya normal. Tapi saya masih tidak tahu banyak tentang mekanismenya, jadi saya terus memeriksanya.
Ternyata ada proses konversi set karakter ketika koneksi MySQL melakukan kueri dan operasi lainnya:
1. Ketika server MySQL menerima permintaan, mengonversi data permintaan dari karakter_set_client ke karakter_set_connection;
2. Sebelum melakukan operasi internal, konversi data yang diminta dari karakter_set_connection ke set karakter operasi internal. Metode penentuan adalah sebagai berikut:
• Gunakan nilai pengaturan karakter untuk setiap bidang data;
• Jika nilai di atas tidak ada, gunakan nilai pengaturan pengaturan karakter default (ekstensi MySQL, standar non-SQL) dari tabel data yang sesuai;
• Jika nilai di atas tidak ada, nilai pengaturan karakter default dari database yang sesuai digunakan;
• Jika nilai di atas tidak ada, gunakan karakter_set_server untuk mengatur nilainya.
3. Konversi hasil operasi dari karakter operasi internal yang diatur ke karakter_set_results.
Apa yang diwakili oleh set karakter ini?
karakter_set_server: set karakter operasi internal default
karakter_set_client: set karakter yang digunakan oleh data sumber klien
Karakter_set_connection: Set Karakter Lapisan Koneksi
karakter_set_results: set karakter hasil kueri
karakter_set_database: Kumpulan karakter default dari database yang saat ini dipilih
karakter_set_system: sistem metadata (nama bidang, dll.) Set Karakter
Saya juga menemukan beberapa pertanyaan umum. Meskipun mereka berbeda dari saya, mereka memiliki nilai referensi yang bagus.
• Sebelum memasukkan data yang dikodekan UTF8 ke dalam tabel data dengan set karakter default adalah UTF8, set karakter koneksi adalah UTF8.
Saat memasukkan, sesuai dengan pengaturan default dari server mysql, karakter_set_client, karakter_set_connection dan karakter_set_results adalah latin1;
Data dari operasi penyisipan akan melalui proses konversi set karakter latin1 => latin1 => utf8. Selama proses ini, setiap karakter Cina yang dimasukkan akan disimpan dari 3 byte asli hingga 6 byte;
Hasilnya selama kueri akan melalui proses konversi set karakter utf8 => utf8, dan 6 byte yang disimpan dikembalikan utuh, menghasilkan kode yang kacau ...
• Atur set karakter koneksi ke UTF8 sebelum memasukkan data yang dikodekan UTF8 ke dalam tabel data dengan set karakter default adalah Latin1.
Saat memasukkan, karakter_set_client, karakter_set_connection dan karakter_set_result semuanya adalah utf8;
Data penyisipan akan dikonversi melalui set karakter utf8 => utf8 => latin1. Jika data asli berisi karakter unicode selain /U0000 ~ /U00FF, itu akan dikonversi ke "?" (0x3f) Simbol karena tidak dapat diwakili dalam set karakter Latin1. Di masa depan, apa pun set karakter koneksi diatur, isinya tidak dapat dipulihkan.
(Bagian ini dikutip dari blog Brother Bird, dan tautannya dilampirkan nanti)
Tabel dalam database saya semuanya diatur dengan pengkodean UTF8, tetapi ketika saya pertama kali terhubung, saya tidak mengatur set karakter koneksi, sehingga standarnya adalah Latin1. Setelah konversi dari UTF8 => Latin1, kode kacau dihasilkan. Pengkodean GBK yang saya gunakan untuk kedua kalinya, dan saya tidak menggunakan pengkodean UTF8. Mengapa tidak apa -apa? Sebenarnya, itu adalah hal yang sama. Orang Cina tidak ada dalam pengkodean Latin, tetapi di GBK dan UTF8, jadi tidak akan ada masalah.
Di atas adalah solusi untuk pengecualian koneksi JDBC yang kacau ke MySQL. Jika Anda masih memiliki pertanyaan, Anda dapat mendiskusikannya di area komentar di bawah ini.