cari
Rumahpangkalan datatutorial mysqlMySQL字符的编码转换问题详解

MySQL字符的编码转换问题详解

Jun 07, 2016 pm 04:09 PM
mysqlutamawatakartikelpengekodanPenjelasan terperinciTukarsoalan

以下的文章主要讲述的是MySQL字符的编码转换问题(latin1-gbk)的详细解析,我们大家都知道容易过想搞好一个站的二次开发,可以用的原数据库的编码有两种,即gbk与lation1。而我用的是 gbk,就涉及到编码转换问题。 这里在LiJun027s Blog查到一个详细的编码比

以下的文章主要讲述的是MySQL字符的编码转换问题(latin1->gbk)的详细解析,我们大家都知道容易过想搞好一个站的二次开发,可以用的原数据库的编码有两种,即gbk与lation1。而我用的是 gbk,就涉及到编码转换问题。

这里在LiJun027’s Blog查到一个详细的编码比较,几种情况如下:

一、实验:

1、情况一

数据库字段MySQL字符集:utf-8

连接字符集:没有显式设置,默认为latin1

页面字符集:gbk

存入过程:

1)页面用GBK表示的SQL向服务器提交存入请求;

2)默认情况下(不用Set Names ‘??’)服务器用latin1打开连接;

3)服务器误认为当前的SQL语句是用latin1表示的;

4)服务器将GBK字符当作latin1字符,错误的运用“latin1转UTF-8函数”将MySQL字符转换后存入UTF-8字段中;

5)( 错误的latin1(其实是GBK) => 错误的UTF-8)

6)如果用phpmyadmin打开该表(用utf8连接)将会看到该字段为乱码;

读取过程:

1)默认情况下(不用Set Names ‘??’)服务器用latin1打开连接;

2)服务器将UTF-8字段中的值转换为latin1返回给客户端;

3)(错误的UTF-8 => 错误的latin1(其实是GBK))该过程为存入过程5的逆过程。(刚好错错得对了)

4)将服务器误认为是latin1的GBK编码按页面字符集正常显示;

用示意图来表示就是:

存入过程:

----------------------

页面 连接 存储

----------------------

GBK => latin1 => utf-8

---------------

------------- |

| +------- 该过程得到的utf-8是一串不知所云的乱码,但MySQL固执的认为这串码为UTF-8

|

+------ MySQL将GBK误认为是latin1

读取过程:

----------------------

页面 连接 存储

----------------------

GBK <= latin1 <= utf-8

---------------

------------- |

| +------- 正是这串乱码经过逆过程转换回正确的GBK编码,只是MySQL认为是latin1而已

|

+------ MySQL将误认为是latin1的GBK编码传回了页面,刚好得到正确的编码。

2、情况二

数据库字段字符集:utf-8

连接MySQL字符集:gbk

页面字符集:gbk

文字描述略。

示意图:

存入过程:

----------------------

页面 连接 存储

----------------------

GBK => GBK => utf-8

------------

------------- |

| +------- 该过程得到的utf-8是由GBK转换而来的,是正确的utf-8编码

|

+------ 页面字符集等于连接字符集,MySQL认为页面传递给它的是GBK编码,它的想法正好符合事实。

读取过程:

----------------------

页面 连接 存储

----------------------

GBK <= GBK <= utf-8

---------------

------------- |

| +------- 用“utf-8转GBK函数”将正确的utf-8编码转换回GBK

|

页面字符集等于连接MySQL字符集,显示没有任何问题。

3、情况三

数据库字段字符集:gbk

连接字符集:没有显式设置,默认为latin1

页面字符集:gbk

存入过程:

----------------------

页面 连接 存储

----------------------

GBK => latin1 => GBK

------------

------------- |

|       +------- 字符被“latin1转GBK函数”转换的成了乱码,但MySQL认为它是GBK,所以工具无法正常显示。

|

+------ MySQL认为页面传递给它的是latin1编码,它将在后续过程中画蛇添足地将正确的GBK转换为乱码。

读取过程:

----------------------

页面   连接   存储

----------------------

GBK <= latin1 <= GBK

---------------

------------- |

| +------- “GBK转latin1函数”将乱码转换为GBK,但MySQL却认为它们是latin1

|

+------ 错误的latin1编码其实是正确的GBK编码,页面显示正常,但工具显示不正常。

二、MySQL字符集之间的转换

笔者试着将GBK字符误当作latin1转换为错误的utf-8能成功,逆过程中将乱码转换回latin1得到的刚好是正确的GBK。

$str = "中文测试";

<ol class="dp-xml"><li class="alt"><span><span>$</span><span class="attribute">str_tran</span><span> = </span><span class="attribute-value">iconv</span><span>('latin1', 'utf-8', $str);   </span></span></li><li><span>echo $str_tran;   </span></li></ol>

显示乱码,既不是GBK也不是utf-8和latin1

<ol class="dp-xml"><li class="alt"><span><span>echo "</span><span class="tag"><</span><span class="tag-name">br</span><span class="tag">><span>-----------</span><span class="tag"><</span><span class="tag-name">br</span><span class="tag">></span><span>";  </span></p>
<li>
<span>$</span><span class="attribute">str_re_tran</span><span> = </span><span class="attribute-value">iconv</span><span>('utf-8', 'latin1', $str_tran);   </span>
</li>
<li class="alt"><span>echo $str_re_tran;    </span></li>
<p></p>
<p>显示 “中文测试”</p>
<p></p>
<p>而将GBK字符误当作utf-8转换为错误的GBK编码则出现错误</p>
<p></p>
<p>$str = "中文测试";</p>
<p></p>
<pre class="brush:php;toolbar:false"><ol class="dp-xml"><li class="alt"><span><span>#$</span><span class="attribute">str_tran</span><span> = </span><span class="attribute-value">iconv</span><span>('utf-8', 'gbk', $str);     </span></span></li></ol>

错误!!!

可见一种编码是否能被当作另一种编码被转换为第三种编码,取决于编码的固有属性,上面我们举的第一个例子只是碰巧GBK编码能被误当作latin1被转换为utf-8。如果是如下情况,则数据库肯定不能正常存取数据。

先说一下教训,建立数据库的时候,同一个应用,所有的编码一定要一致,不然就是自寻烦恼。

搞了半天用iconv转换后还是不行。(在Windows下开启iconv只需要把php.ini里面的;extension=php_mbstring.dll前面的“;”去掉即可。网上查了下。很多都说要开启;extension=php_iconv.dll这个东东,但下了几个版本的PHP都没有看到有这一行,估计是老版本才需要这么干吧?)

最后找到一个工具,可以实现latin1gbk,gbkutf8,gbkbig5,的编码的相互转换,程序可以进行多次转换即可以实现latin1->gbk->utf8等的转换,但是不能跳跃转换(例:latin1不能直接转换成utf8)。

还不错,转过来没有乱码,终于解决问题。

另外提一下备份数据库工具:帝国数据备份王(Empirebak)。一款开源免费、专门为MySQL大数据的备份与导入而设计的稳定高效软件,系统采用分卷备份与导入,理论上可备份任何大小的数据库。


Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Bagaimanakah kardinaliti indeks MySQL mempengaruhi prestasi pertanyaan?Bagaimanakah kardinaliti indeks MySQL mempengaruhi prestasi pertanyaan?Apr 14, 2025 am 12:18 AM

Cardinality Indeks MySQL mempunyai kesan yang signifikan terhadap prestasi pertanyaan: 1. Indeks kardinaliti yang tinggi dapat lebih berkesan menyempitkan julat data dan meningkatkan kecekapan pertanyaan; 2. Indeks kardinaliti yang rendah boleh membawa kepada pengimbasan jadual penuh dan mengurangkan prestasi pertanyaan; 3. Dalam indeks bersama, urutan kardinaliti yang tinggi harus diletakkan di depan untuk mengoptimumkan pertanyaan.

MySQL: Sumber dan Tutorial untuk Pengguna BaruMySQL: Sumber dan Tutorial untuk Pengguna BaruApr 14, 2025 am 12:16 AM

Laluan pembelajaran MySQL termasuk pengetahuan asas, konsep teras, contoh penggunaan, dan teknik pengoptimuman. 1) Memahami konsep asas seperti jadual, baris, lajur, dan pertanyaan SQL. 2) Ketahui definisi, prinsip kerja dan kelebihan MySQL. 3) menguasai operasi CRUD asas dan penggunaan lanjutan, seperti indeks dan prosedur yang disimpan. 4) Biasa dengan debugging kesilapan biasa dan cadangan pengoptimuman prestasi, seperti penggunaan rasional indeks dan pertanyaan pengoptimuman. Melalui langkah -langkah ini, anda akan memahami sepenuhnya penggunaan dan pengoptimuman MySQL.

Mysql dunia nyata: Contoh dan kes penggunaanMysql dunia nyata: Contoh dan kes penggunaanApr 14, 2025 am 12:15 AM

Aplikasi dunia nyata MySQL termasuk reka bentuk pangkalan data asas dan pengoptimuman pertanyaan kompleks. 1) Penggunaan Asas: Digunakan untuk menyimpan dan mengurus data pengguna, seperti memasukkan, menanyakan, mengemas kini dan memadam maklumat pengguna. 2) Penggunaan lanjutan: Mengendalikan logik perniagaan yang kompleks, seperti perintah dan pengurusan inventori platform e-dagang. 3) Pengoptimuman Prestasi: Meningkatkan prestasi dengan menggunakan indeks, jadual partisi dan cache pertanyaan.

Perintah SQL di MySQL: Contoh PraktikalPerintah SQL di MySQL: Contoh PraktikalApr 14, 2025 am 12:09 AM

Perintah SQL di MySQL boleh dibahagikan kepada kategori seperti DDL, DML, DQL, dan DCL, dan digunakan untuk membuat, mengubah suai, memadam pangkalan data dan jadual, memasukkan, mengemas kini, memadam data, dan melakukan operasi pertanyaan yang kompleks. 1. Penggunaan asas termasuk jadual penciptaan createtable, memasukkan data memasukkan, dan pilih data pertanyaan. 2. Penggunaan lanjutan melibatkan gabungan untuk Jadual Bergabung, Subqueries dan Groupby untuk Agregasi Data. 3. Kesilapan umum seperti kesilapan sintaks, jenis data yang tidak sepadan dan masalah kebenaran boleh disahpepijat melalui pemeriksaan sintaks, penukaran jenis data dan pengurusan kebenaran. 4. Cadangan Pengoptimuman Prestasi termasuk menggunakan indeks, mengelakkan pengimbasan jadual penuh, mengoptimumkan operasi gabungan dan menggunakan transaksi untuk memastikan konsistensi data.

Bagaimanakah InnoDB mengendalikan pematuhan asid?Bagaimanakah InnoDB mengendalikan pematuhan asid?Apr 14, 2025 am 12:03 AM

InnoDB mencapai atomik melalui undolog, konsistensi dan pengasingan melalui mekanisme penguncian dan MVCC, dan kegigihan melalui redolog. 1) Atomicity: Gunakan Undolog untuk merekodkan data asal untuk memastikan urus niaga dapat dilancarkan kembali. 2) Konsistensi: Memastikan konsistensi data melalui penguncian peringkat baris dan MVCC. 3) Pengasingan: Menyokong pelbagai tahap pengasingan, dan RepeatableRead digunakan secara lalai. 4) Kegigihan: Gunakan redolog untuk merekodkan pengubahsuaian untuk memastikan data disimpan untuk masa yang lama.

Tempat Mysql: Pangkalan Data dan PengaturcaraanTempat Mysql: Pangkalan Data dan PengaturcaraanApr 13, 2025 am 12:18 AM

Kedudukan MySQL dalam pangkalan data dan pengaturcaraan sangat penting. Ia adalah sistem pengurusan pangkalan data sumber terbuka yang digunakan secara meluas dalam pelbagai senario aplikasi. 1) MySQL menyediakan fungsi penyimpanan data, organisasi dan pengambilan data yang cekap, sistem sokongan web, mudah alih dan perusahaan. 2) Ia menggunakan seni bina pelanggan-pelayan, menyokong pelbagai enjin penyimpanan dan pengoptimuman indeks. 3) Penggunaan asas termasuk membuat jadual dan memasukkan data, dan penggunaan lanjutan melibatkan pelbagai meja dan pertanyaan kompleks. 4) Soalan -soalan yang sering ditanya seperti kesilapan sintaks SQL dan isu -isu prestasi boleh disahpepijat melalui arahan jelas dan log pertanyaan perlahan. 5) Kaedah pengoptimuman prestasi termasuk penggunaan indeks rasional, pertanyaan yang dioptimumkan dan penggunaan cache. Amalan terbaik termasuk menggunakan urus niaga dan preparedStatemen

Mysql: Dari perniagaan kecil ke perusahaan besarMysql: Dari perniagaan kecil ke perusahaan besarApr 13, 2025 am 12:17 AM

MySQL sesuai untuk perusahaan kecil dan besar. 1) Perniagaan kecil boleh menggunakan MySQL untuk pengurusan data asas, seperti menyimpan maklumat pelanggan. 2) Perusahaan besar boleh menggunakan MySQL untuk memproses data besar dan logik perniagaan yang kompleks untuk mengoptimumkan prestasi pertanyaan dan pemprosesan transaksi.

Apa yang dibaca oleh Phantom dan bagaimana InnoDB menghalang mereka (kunci seterusnya)?Apa yang dibaca oleh Phantom dan bagaimana InnoDB menghalang mereka (kunci seterusnya)?Apr 13, 2025 am 12:16 AM

InnoDB secara berkesan menghalang pembacaan hantu melalui mekanisme utama. 1) Kekunci seterusnya menggabungkan kunci baris dan kunci jurang untuk mengunci rekod dan jurang mereka untuk mengelakkan rekod baru daripada dimasukkan. 2) Dalam aplikasi praktikal, dengan mengoptimumkan pertanyaan dan menyesuaikan tahap pengasingan, persaingan kunci dapat dikurangkan dan prestasi konkurensi dapat ditingkatkan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini