MySQL之对数据库库表的字符集的更改

数据字符集修改步骤:

对于已有的数据库想修改字符集不能直接通过 "alter database character set *"或 "alter table tablename character set *",这两个命令都没有更新已有记录的字符集,而只是对新创建的表或者记录生效。 已经有记录的字符集的调整,必须先将数据导出,经过修改字符集后重新导入后才可完成。 修改数据库默认编码: alter database [your db name] charset [your character setting]

下面模拟将latin1字符集的数据修改成GBK字符集的实际过程。

1、导出表结构 [[email protected] ~]# /opt/mysql/bin/mysqldump --default-character-set=latin1  -uroot -p -d dbname > alltable.sql

2、编辑alltable.sql将latin1改成GBK

3、确保数据库不再更新,导出所有数据 [[email protected] ~]# /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 注意:选择目标字符集时,要注意最好大于等于源字符集(字库更大),否则,可能会丢失不被支持的数据。

具体操作如下:

更改前的数据:
[[email protected] 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 | 老男孩    |
+----+-----------+
导出表结构:
[[email protected] mysql]# /opt/mysql/bin/mysqldump --default-character-set=latin1 -uroot -p -d oldboy > zhulh/alltable.sql
查看导出内容:
[[email protected] 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:
[[email protected] mysql]# sed -i "s/latin1/utf8/" zhulh/alltable.sql
[[email protected] 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;
确保数据库不再更新,导出所有数据
[[email protected] 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)
[[email protected] 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)
导入数据:
[[email protected] mysql]# mysql -uroot -p123456 oldboy < zhulh/alltable.sql
Warning: Using a password on the command line interface can be insecure.
[[email protected] mysql]# mysql -uroot -p123456 oldboy < zhulh/alldata.sql
Warning: Using a password on the command line interface can be insecure.
[[email protected] 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 | 老男孩    |
+----+-----------+
[[email protected] mysql]# 
时间: 2024-10-08 22:21:36

MySQL之对数据库库表的字符集的更改的相关文章

修改数据库库表的字符集

数据字符集修改步骤 对应已经存在的数据库想修改字符集,不能直接通过"alter database character set *" 或者"alter table tablename character set *" ,这两个命令都没有更新已有记录的字符集,而只是对新创建的表或者记录生效. 已经有记录的字符集的调整,必须想将数据导出,经过修改字符集后重新导入才能完成 修改数据库默认编码 alter database 数据库名称 charset 字符集名称 alter

如何更改生产MySQL数据库库表的字符集

以前学习mysql的时候,实验的笔记,今天整理的时候看到了,所以记录下,备忘 1.导出表结构 mysqldump -uroot -predhat12345 -S /data/3306/mysql.sock --default-character-set=latin1 -d kitty>kittytable.sql 说明:-d只导表结构 2.编辑kittytable.sql,将lantin1改成utf8 可以用sed批量修改 3.确保数据库不再更新,导出所有数据 mysqldump -uroot

mysql 给axel数据创建表

create table point( id int primary key auto_increment ,point_x double, point_y double, boundry bool ); 一.sql语句 1.操作数据库 (1)创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification:    [DEFA

一次MySQL两千万数据大表的优化过程,三种解决方案

问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务. 问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql语句写的不仅仅是垃圾,简直无法直视.原开发人员都已离职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的那个!!! 我尝试解决该问题,so,有个这个日志. 方案概述 方案一:优化现有mysql数据库.优点:不影响现有业务

MySQL 已有大数据量表进行分区踩坑

一.背景mysql 表中已有 4 亿数据,为提高查询效率,需创建分区,一开始计划是创建 HASH 分区,结果报错:ERROR 1659 (HY000): Field 'partno' is of a not allowed type for this type of partitioning1 查询得知报错原因,HASH 分区只支持数字分区,而我要分区的字段是 varchar 类型,故改用 KEY 分区二.解决 KEY 分区语句: alter table TABLENAME PARTITION

mysql基础之创建库表时字符集设置问题

创建数据库及表时设置字符集,避免出现中文乱码的方法: 创建数据库 CREATE DATABASE test CHARACTER SET utf8 COLLATE utf8_general_ci; --注意后面三个单词之间是有下划线的 对于每个选项所给定的值,前面没有等号:在第一个选项和第二个选项之间也没有逗号. 创建表 CREATE TABLE mytable(     id varchar(40) NOT NULL default '',     userId varchar(40) NOT 

mysql -- 循环插入数据到表中

备忘: 1.经搜索发现,MySql不支持直接写SQL语句实现循环插入功能. 想要实现该功能,可以用其他语言操控MySql来实现,或者用存储过程来实现(Store Procedure--SP). 2.以下是SP实现经过,记下来怕忘记了. --表结构定义TDefUser,有个自动增量的PK: Table Create Table -------- ----------------------------------------------------------tdefuser CREATE TAB

利用orm对数据库库表的相关操作

方式一: # create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象   book_obj=Book.objects.create(title="python葵花宝典",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12") 方式二: book_obj=Book(title="python葵花宝典",state=True

mysql/gbase数据库全库库表记录数统计

file:mysql_rows.sh 运行:sh mysql_rows.sh 库名 脚本内容: #!/bin/bash user=...pwd=... ip=... port=... tb_name=`mysql -u $user -p$pwd -h$ip -P$port -e "select table_name from information_schema.tables where table_schema=$1" |awk 'NR>1{print $1}'`>/da