MySQL之對數據庫庫表的字符集的更改


數據字符集修改步驟:

對於已有的數據庫想修改字符集不能直接通過 "alter database character set *"或 "alter table tablename character set *",這兩個命令都沒有更新已有記錄的字符集,而只是對新創建的表或者記錄生效。 已經有記錄的字符集的調整,必須先將數據導出,經過修改字符集后重新導入后才可完成。 修改數據庫默認編碼: alter database [your db name] charset [your character setting]

下面模擬將latin1字符集的數據修改成GBK字符集的實際過程。

1、導出表結構 [root@master ~]# /opt/mysql/bin/mysqldump --default-character-set=latin1  -uroot -p -d dbname > alltable.sql

2、編輯alltable.sql將latin1改成GBK

3、確保數據庫不再更新,導出所有數據 [root@master ~]# /opt/mysql/bin/mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 dbname > alldata.sql

參數說明: --quick:用於轉儲大的表,強制mysqldump從服務器一次一行的檢索數據而不是檢索所有行,並輸出前CACHE到內存中。

--no-create-info:不創建CREATE TABLE語句。

--extended-insert:使用包括幾個VALUES列表的多行INSERT語法,這樣你更小,IO也小,導入數據時會非常快。

--default-character-set=latin1:按照原有字符集導出數據,這樣導出的文件中,所有中文都是可見的,不會保存成亂碼。

4、打開alldata.sql將set names latin1修改成set names gbk;

5、刪庫和建庫: create database dbname default charset gbk;

6、創建表,執行alltable.sql mysql -uroot -p dbname < alltable.sql

7、導入數據 mysql -uroot -p dbname < alldata.sql 注意:選擇目標字符集時,要注意最好大於等於源字符集(字庫更大),否則,可能會丟失不被支持的數據。

具體操作如下:

更改前的數據:
[root@master mysql]# mysql -uroot -p123456 -e "show create database oldboy\G;show create table oldboy.student\G;set names latin1;select * from oldboy.student;\G"
Warning: Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
       Database: oldboy
Create Database: CREATE DATABASE `oldboy` /*!40100 DEFAULT CHARACTER SET latin1 */
*************************** 1. row ***************************
       Table: student
Create Table: CREATE TABLE `student` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1
+----+-----------+
| id | name      |
+----+-----------+
|  1 | oldboy    |
|  2 | oldgirl   |
|  3 | inca      |
|  4 | zuma      |
|  5 | kaka      |
|  6 | ???       |
|  7 | 老男孩    |
+----+-----------+
導出表結構:
[root@master mysql]# /opt/mysql/bin/mysqldump --default-character-set=latin1 -uroot -p -d oldboy > zhulh/alltable.sql
查看導出內容:
[root@master mysql]# grep -E -v "#|\/|^$|--" zhulh/alltable.sql
DROP TABLE IF EXISTS `error_log`;
CREATE TABLE `error_log` (
  `error_message` char(80) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS `t2`;
CREATE TABLE `t2` (
  `s1` int(11) NOT NULL,
  PRIMARY KEY (`s1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS `t3`;
CREATE TABLE `t3` (
  `s1` int(11) DEFAULT NULL,
  KEY `s1` (`s1`),
  CONSTRAINT `t3_ibfk_1` FOREIGN KEY (`s1`) REFERENCES `t2` (`s1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
修改latin1為utf8:
[root@master mysql]# sed -i "s/latin1/utf8/" zhulh/alltable.sql
[root@master mysql]# grep -E -v "#|\/|^$|--" zhulh/alltable.sql
DROP TABLE IF EXISTS `error_log`;
CREATE TABLE `error_log` (
  `error_message` char(80) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `t2`;
CREATE TABLE `t2` (
  `s1` int(11) NOT NULL,
  PRIMARY KEY (`s1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `t3`;
CREATE TABLE `t3` (
  `s1` int(11) DEFAULT NULL,
  KEY `s1` (`s1`),
  CONSTRAINT `t3_ibfk_1` FOREIGN KEY (`s1`) REFERENCES `t2` (`s1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
確保數據庫不再更新,導出所有數據
[root@master mysql]# /opt/mysql/bin/mysqldump --default-character-set=latin1 --quick --no-create-info --extended-insert  -uroot -p -B oldboy > zhulh/alldata.sql
修改latin1為utf8:(將SET NAMES latin1 修改成SET NAMES utf8)
[root@master mysql]# sed -i "s/latin1/utf8/" zhulh/alldata.sql
刪除老庫:
root@mysql5.6 01:09:24->drop database oldboy;
Query OK, 4 rows affected (0.20 sec)
新建新庫:
root@mysql5.6 01:12:53->create database oldboy default charset utf8;
Query OK, 1 row affected (0.00 sec)
導入數據:
[root@master mysql]# mysql -uroot -p123456 oldboy < zhulh/alltable.sql 
Warning: Using a password on the command line interface can be insecure.
[root@master mysql]# mysql -uroot -p123456 oldboy < zhulh/alldata.sql 
Warning: Using a password on the command line interface can be insecure.
[root@master mysql]# mysql -uroot -p123456 -e "select * from oldboy.student;"
Warning: Using a password on the command line interface can be insecure.
+----+-----------+
| id | name      |
+----+-----------+
|  1 | oldboy    |
|  2 | oldgirl   |
|  3 | inca      |
|  4 | zuma      |
|  5 | kaka      |
|  6 | ???       |
|  7 | 老男孩    |
+----+-----------+
[root@master mysql]# 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM