Mysql修改已有数据的字符集

Mysql修改已有数据的字符集

问题

在生产环境中跑了很久,发现MysqlClient连接的字符集是默认的latin1,我们一直以为都是utf8,造成这样的误解,是因为在内网环境中,我们是源码编译的Mysql,并指定了编译选项字符集位utf8,这时Mysql的是默认字符接都是utf8.

而在外网,我们是二进制包安装,默认是latin1,虽然在my.conf中指定了[client] [mysql] [mysqld] 中字符集为utf8,这并不能保证MysqlClient连接时的字符集为utf8.所以最好是在建立连接是指定字符集,这个是能保证的.如:

//C连接 需在建立连接前设置
mysql_options(m_mysql, MYSQL_SET_CHARSET_NAME, "utf8");

由于数据是通过laint1连接到Mysql存储的,所以取数据也需要laint1的连接方式.但这个方式与预期不符,而且其他客户端连接会通过utf8连接,这就会导致乱码,必须修复成通过utf8连接存储的数据.

修复原理

通过latin1的方式建立连接把数据取出,然后以通过utf8的方式建立连接把数据存回去.

修复事例

表结构定义如下:

CREATE TABLE IF NOT EXISTS `tbl_friend` (
  `Uin` bigint(20) unsigned NOT NULL,
  `Name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`Uin`),
  UNIQUE KEY `Name` (`Name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
select CONCAT(‘update tbl_friend set `Name`=\‘‘, Name, ‘\‘ where Uin=‘, Uin,‘;‘) from tbl_friend into outfile ‘/tmp/UpdateFriendName.sql‘ CHARACTER SET ‘latin1‘;

在mysql中执行上面的语句,然后在mysql中导入/tmp/UpdateFriendName.sql文件,数据就修复了. 需要注意的是,my.cnf的[mysql]段中字符集是你修改后的字符集或者通过 mysql --default-character-set=utf8 < /tmp/UpdateFriendName.sql  指定修复后的字符集.

修复后可以在mysql中通过set names utf8/latin1,然后select Name from tbl_friend limit 10; 来看变化,

可能遇到的阻碍

如果在执行当中遇到 The MySQL server is running with the --secure-file-priv option so it cannot execute this statement 需要在my.conf中的[mysqld]增加secure_file_priv =,然后重启Mysql.

时间: 2024-11-10 13:59:16

Mysql修改已有数据的字符集的相关文章

mysql更改已有数据表的字符集,保留原有数据内容

mysql更改已有数据表的字符集,保留原有数据内容     原文网址:http://blog.csdn.net/learn_2/article/details/6460370 环境:在应用开始阶段没有正确的设置字符集,在运行一段时间以后才发现存在不能满足需求需要调整,又不想丢弃这段时间的数据,那么就需要进行字符集的修改.字符集的修改不能直接通过"alter database character set *** " 或者 "alter table tablename chara

Asp.net 修改已有数据的DataTable中某列的数据类型

DataTable dt_PI = new DataTable(); //克隆表结构 dt_PI = ds.Tables[0].Clone(); dt_PI.Columns["FLTFullPercentage"].DataType = typeof(String);//修改[满柜百分比]列的数据类型 foreach (DataRow row in ds.Tables[0].Rows) { DataRow rowNew = dt_PI.NewRow(); foreach (DataCo

mysql修改默认的环境的字符集为utf-8

mysql修改环境的默认字符集为utf-8(当然你也可以设置成utf-8) 首先得在服务里关掉mysql的服务 然后到你的mysql的安装路径,如果是自定义就找到自定义的路径,默认是:C:\Program Files\MySQL\MySQL Server 5.0\my.ini. 找到那个  client  mysql   里加入        default-character-set=utf8 mysqld下面加入:    default-character-set=utf8 init_con

MySQL忽略已重复数据强制创建唯一索引

常规方法: CREATE UNIQUE INDEX `idx_m2b_product_photo_pid_sort` ON `m2b`.`m2b_product_photo` (pid, sort) COMMENT '' ALGORITHM DEFAULT LOCK DEFAULT; 忽略已重复数据强制创建唯一索引的方法: ALTER IGNORE TABLE `m2b_product_photo` ADD UNIQUE `idx_m2b_product_photo_pid_sort` (`pi

修改已有数据表

通过 CREATE TABLE 语句创建的数据表的结构并不是永远不变的,很多因素决定我们需要对数据表的结构进行修改,比如我们需要在T_Person表中记录一个人的个人爱好信息,那么就需要在T_Person中增加一个记录个人爱好的字段,再如我们不再需要记录一个人的年龄,那么我们就可以将FAge字段删除.这些操作都可以使用ALTER TABLE 语句来完成. ANSI-SQL中为ALTER TABLE 语句规定了两种修改方式:添加字段和删除字段,有的数据库系统中还提供了修改表名.修改字段类型.修改字

mysql修改已授过的权限

对已经授过的用户权限进行修改. 我们知道:grant 是授权命令,也可以进行授权后的权限修改操作注意,修改权限的时候,可以直接使用identified by password ,保持之前的密码不变! 一般我们grant授权的时候,使用identitied by,后面跟的是明文密码,生成后在mysql.user表里查询账号信息显示的才是密文密码但是grant授权时,也可以在identified by 后面加password,这样后面设置的就是密文密码 有的时候,由开发人员先自己生成密文密码,即他们

Oracle中修改已存在数据的字段类型

原字段类型为varchar2,实际上均为数字,想将字段类型改为number,报错ORA-01439: column to be modified must be empty to change datatype 解决方法: tablename为表名称,colname为要修改的字段名 alter table tablename add tempcolumn varchar2(100);--添加临时字段tempcolumn update tablename set tempcolumn=colnam

修改已有数据的Datatable的列的类型

private DataTable UpdateDataTable(DataTable argDataTable) { DataTable dtResult = new DataTable(); //克隆表结构 dtResult = argDataTable.Clone(); foreach (DataColumn col in dtResult.Columns) { switch (col.ColumnName) { case "钢束编号": col.DataType = typeo

MySQL主从复制——主库已有数据的解决方案

在上篇文章中我们介绍了基于Docker的Mysql主从搭建,一主多从的搭建过程就是重复了一主一从的从库配置过程,需要注意的是,要保证主从库my.cnf中server-id的唯一性.搭建完成后,可以在主库show slave hosts查看有哪些从库节点. 我们来简单了解一下Mysql主从复制的过程: (1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events): (2) slave将master的binary log ev