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.
Mysql修改已有数据的字符集的更多相关文章
- mysql更改已有数据表的字符集,保留原有数据内容
mysql更改已有数据表的字符集,保留原有数据内容 原文网址:http://blog.csdn.net/learn_2/article/details/6460370 环境:在应用开始阶段没有 ...
- Oracle中如何修改已存在数据的列名的数据类型
在oracle中,如何修改已存在数据列名的数据类型 一般人直接在表结构设计这里修改,这里只适合修改列没有数据,可修改 那么,如何这个列是有数据,是怎么修改的呢? 直接修改会Oracle错误 第一步:先 ...
- MySQL修改表中字段的字符集
MySQL修改表中字段的字符集 ALTER TABLE 表名 MODIFY 字段名 要修改的属性: 例:ALTER TABLE `guaduates` MODIFY `studentno` CHAR( ...
- oracle修改已存在数据的字段类型
第一次使用oracle数据库,在通过Navicat premium工具修改字段类型时,发现报“ORA-01439: column to be modified must be empty to cha ...
- 修改mysql5.7数据表字符集编码的命令
查看表中字符集的命令 show variables like '%char%' 更改数据库中数据表的字符集靠谱命令,亲测可行,在workbench和phpmyadmin上都通过 alter table ...
- Yii MySQL修改数据库的数据
最新学习Yii框架,分享一些学习心得,适合初学者,大神请按ctrl + w //第一种方法 <?php /* * $id 代表主键,可以是一个也可以是一个集合. * $attributes 代表 ...
- oracle数据库中修改已存在数据的字段
在oracle中,如果已经存在的数据的某些列,假如要更换类型的话,有的时候是比较麻烦的, 会出现:ORA-01439: column to be modified must be empty to c ...
- Asp.net 修改已有数据的DataTable中某列的数据类型
DataTable dt_PI = new DataTable(); //克隆表结构 dt_PI = ds.Tables[].Clone(); dt_PI.Columns["FLTFullP ...
- mysql 修改已存在的表增加ID属性为auto_increment自动增长
今天有需要将已经存在表设置自动增长属性 具体如下 alter table customers change id id int not null auto_increment primary key; ...
随机推荐
- Java 制作证书的工具keytool用法总结
一.keytool的概念 keytool 是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.在 ...
- 《MATLAB从入门到放弃》二维曲线和图形绘制基础(二):使用Help文档学习line、plot、plotyy、subplot、hold绘图函数
目录: » plot 最常用的二维曲线绘图函数 > 帮助文档 > 基本使用语法 > 线条的样式.符号和颜色调整 > 图形属性调整 > 使用图形句柄进行设置 » ...
- 在 JavaScript 中使用构造器函数模拟类
今天,我们要讲的是在 JavaScript 中使用构造器函数(construcor function)模拟类. 构造器函数简介 你可以使用 ES6 的 class 关键字来实现类,不过我建议你使用传统 ...
- 用es6的class关键字定义一个类
es6新增class关键字使用方法详解. 通过class关键字,可以定义类.基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法 ...
- 用python的TK模块实现猜成语游戏(附源码)
说明:本游戏使用到的python模块有tkinter,random,hashlib:整个游戏分为四个窗口,一个进入游戏的窗口.一个选关窗口.一个游戏进行窗口和一个游戏结束的窗口. 源码有两个主要的py ...
- Mysql主从复制原理及配置
Mysql主从复制原理及配置 1.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其 ...
- Elixir游戏服设计六
接上章,我新建了个app做包含Table模型, TableServer等.Table桌子的代码暂时如下, 有一些状态还没用上 defmodule Table do @state_accept 0 #准 ...
- 一个高性能、轻量级的分布式内存队列系统--beanstalk
Beanstalk是一个高性能.轻量级的.分布式的.内存型的消息队列系统.最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟.其实Beanstalkd是典型的类Mem ...
- cors解决ajax请求跨域问题
Access-Control-Allow-Origin: * 适用tomcat部署的项目 在web.xml里添加以下内容 <filter> <filter-name>CorsF ...
- sqlserver 使用脚本创建Sql Server代理作业
use master GO /* --开启sql server代理 sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_con ...