亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網(wǎng)絡(luò),我們將竭誠為您提供優(yōu)質(zhì)的服務(wù)! 誠征網(wǎng)絡(luò)推廣 | 網(wǎng)站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯(lián)系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業(yè)務(wù)咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發(fā)消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術(shù)支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當(dāng)前位置:首頁 >> 技術(shù)文章 >> 文章瀏覽
技術(shù)文章

MySQL數(shù)據(jù)庫中數(shù)據(jù)庫移植中的亂碼問題

添加時間:2013-1-9 17:25:28  添加: 思海網(wǎng)絡(luò) 

MySQL移植含有中文的數(shù)據(jù)時,很容易出現(xiàn)亂碼問題。很多是在從MySQL4.x向MySQL5.x移植的時候出現(xiàn)。MySQL的缺省字符集是latin1,在使用MySQL4.x的時候,很多人都是用的latin1字符集。而當(dāng)使用MySQL5時往往愿意使用UTF-8。那么我們的任務(wù)是不是要把數(shù)據(jù)中的字符從latin1轉(zhuǎn)為UTF-8呢?不是的。

用一句不大準(zhǔn)確,但又比較形象的說法是,在之前的系統(tǒng)中,我們是用latin1保存了使用GB系列字符集(GBK、GB2312等)的漢字。怎么這樣說呢?

以下為引用的內(nèi)容:

mysql> show create table test\G
*************************** 1. row
Table: test
Create Table: CREATE TABLE `test` (
`a` varchar(100) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> show create table testlatin1\G
*************************** 1. row *
Table: testlatin1
Create Table: CREATE TABLE `testlatin1` (
`a` varchar(100) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.01 sec)

 
字符集是告訴我們,如果沒有特別指定列的字符集,那么字符類型列的字符集與表的缺省字符集一樣。

列的字符集是要告訴MySQL,這里面保存的字符所使用的字符集是什么。但到底保存的是什么字符集的字符,不由MySQL決定,MySQL也不進(jìn)行檢查。

在UTF-8廣泛使用之前,我們使用的漢字都是GB系列的字符集,比如GB2312、GBK、GB18030等等。

在缺省字符集為latin1的MySQL中,我們通常就把GB字符集的漢字保存到數(shù)據(jù)庫中,但是卻告訴MySQL那是latin1字符集。而GB字符集是一個漢字占兩個字節(jié),latin1是一個字符占一個字節(jié)。也就是說一個GB漢字被當(dāng)成兩個latin1字符來保存了。這讓我想起了當(dāng)初的iso8859_1,也是類似的情況。只要我們保存和讀取時都當(dāng)作latin1,不進(jìn)行轉(zhuǎn)換,然后在顯示時當(dāng)作GB字符集,就能夠正確使用。

那么怎么把latin1保存的漢字正確地導(dǎo)UTF-8字符集的數(shù)據(jù)庫中呢?

首先,新的數(shù)據(jù)庫中的列,要使用UTF-8字符集。一種辦法是創(chuàng)建database時指定缺省字符集,這樣在建表時如果不指定字符集則使用database的缺省字符集。

導(dǎo)出的數(shù)據(jù)要以latin1字符集導(dǎo)出,實際上就是告訴MySQL導(dǎo)出時不做轉(zhuǎn)換(因為原有的表都是latin1字符集的)。

mysqldump出來以后,再用MySQL進(jìn)行導(dǎo)入時,還要告訴MySQL,當(dāng)前的數(shù)據(jù)是gb系列的字符集,比如gbk。這樣,MySQL負(fù)責(zé)把數(shù)據(jù)由gbk轉(zhuǎn)換為UTF-8,保存到數(shù)據(jù)庫中。

如何告訴MySQL導(dǎo)入的SQL是什么字符集呢,一種方法是用--default-character-set,但有時會起不到實際作用。這是因為mysqldump出來的文件里有set names語句。比如:

以下為引用的內(nèi)容:

head EA192.060913.sql

-- MySQL dump 10.10
--
-- Host: localhost Database: EA192
-- ----------------------------------
-- Server version 5.0.16-standard-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT
=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS
=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION
=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES latin1 */;

 
/*! */是MySQL特有有句法,在其他數(shù)據(jù)庫會被當(dāng)成注釋忽略掉。/*!后面的40101是表示版本,在4.1.1及以上版才執(zhí)行該條語句。

這里看到有一條SET NAMES latin1。它的一個作用是告訴mysql,客戶端傳過去的數(shù)據(jù)是latin1字符集。因為有這樣一條SET NAMES,--default-character-set也就起不到作用了。如果不幸有這樣一條SQL,那么需要把它去掉或者改成SET NAMES gbk。修改或者刪除的辦法,當(dāng)數(shù)據(jù)量比較大的時候,可以用head和tail來配合。比如還是上面的那個文件:

先用head看一下SET NAMES在第幾行(數(shù)一下),上面看到是第10行。

以下為引用的內(nèi)容:

wc -l EA192.060913.sql
1987 EA192.060913.sql
得到總行數(shù)是1987

head -9 EA192.060913.sql > final.sql
brum@brum-laptop:~$ tail -1977 EA192.060913.sql
 >> final.sql
brum@brum-laptop:~$

 
head -9是取前9行,tail -1977是取后1977行,這樣就把第10行隔過去了。

得到final.sql再用MySQL運行時,就可以使用--default-character-set=gbk了。

還有一種辦法是mysqldump時使用--set-charset=false,這樣就不會出現(xiàn)SET NAMES了。

目前為止,還可能有問題,出在create table的SQL中,比如:

以下為引用的內(nèi)容:
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`a` varchar(100) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
這里仍然有個CHARSET=latin1,它將導(dǎo)致新創(chuàng)建的表的缺省字符集是latin1,而不是我們想要的UTF8。

怎么辦呢,如果數(shù)據(jù)量不大的話,可以考慮用編輯器把它去掉或者改成UTF8,如果數(shù)據(jù)量大的話可以考慮用sed,但可能仍然時間比較長。

還有一種辦法就是mysqldump,使用--create-options=false,不導(dǎo)出表的創(chuàng)建屬性。但如果導(dǎo)出的表的存儲引擎不同的話就有問題了,因為引擎類型(innodb、myisam等)都被忽略了。

此外,mysqldump導(dǎo)出時,不要使用-B,而是直接指定一個database名字,目的是不出現(xiàn)CREATE DATABASE語句,因為其中也可能會有缺省字符集的子句,會影響那些未在CREATE TABLE中指定字符集的表。如果你導(dǎo)出的SQL中有CREATE DATABASE,那么需要注意一下有沒有字符集的子句,如果有的話,也需要修改。

好了,通過上述方法導(dǎo)出或者處理過的導(dǎo)出文件可以使用mysql --default-character-set=gbk來導(dǎo)入了。

關(guān)鍵字:MySQL、數(shù)據(jù)庫

分享到:

頂部 】 【 關(guān)閉
版權(quán)所有:佛山思海電腦網(wǎng)絡(luò)有限公司 ©1998-2024 All Rights Reserved.
聯(lián)系電話:(0757)22630313、22633833
中華人民共和國增值電信業(yè)務(wù)經(jīng)營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網(wǎng)站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網(wǎng)安 舉報有獎  警警  手機(jī)打開網(wǎng)站