MySQL 字符集问题及安全的更新操作

时间:2023-12-16 17:34:20

一、字符集乱码

1.操作系统字符集

[root@mysql5 ~]# cat /etc/system-release /etc/sysconfig/i18n
CentOS release 6.5 (Final) # 操作系统发行版本
LANG="en_US.UTF-8"      # 语言版本
SYSFONT="latarcyrheb-sun16"

2.设置MySQL客户端

set names utf8;

[mysql]

default-character-set=utf8

3.设置MySQL服务端

[mysqld]
# mysql5.1
default-character-set=utf8
# mysql5.5
character-set-server=utf8

4.库表

create database zwq default character set utf8 collate utf8_general_ci;

5、系统字符集与数据库字符集的关联

[root@mysql5 ~]# cat /etc/sysconfig/i18n ; mysql -e "show variables like 'character_set%';";
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
+--------------------------+----------------------------------+
| Variable_name | Value     |
+--------------------------+----------------------------------+
| character_set_client | utf8 $LANG决定           |
| character_set_connection | utf8 $LANG决定 |
| character_set_database | utf8 属性 character_set_server |
| character_set_filesystem | binary |
| character_set_results | utf8 $LANG决定 |
| character_set_server | utf8 属性 character_set_server |
| character_set_system | utf8 $LANG决定 |
| character_sets_dir | /app/mysql/share/charsets/    |
+--------------------------+-----------------------------------+

/etc/sysconfig/i18n中的LANG变量决定了 character_set_client、character_set_connection、character_set_results、character_set_system

my.cnf配置项

[mysqld]

character_set_server 决定了 character_set_database、character_set_server

character_set_filesystem 决定了 character_set_filesystem

set names utf8 决定了 character_set_client、character_set_connection、character_set_results

--default-character-set=utf8 效果跟set names utf8一样

二、更改已有数据的字符集

-- 1、建库建表的语句导出,sed批量修改为utf8

  mysqldump -uroot -proot --default-character-set=latin1 -d zwq > destructer.sql
-- 2、导出所有数据

  mysqldump -uroot -proot --quick --no-create-info --extended-insert --default-character-set=utf8 db_name >db_name_data.sql 
-- 3、修改mysql客户端和服务端编码为utf8
-- 4、删除原有的库表、数据
-- 5、导入新的建库建表语句
-- 6、导入mysql的所有数据

三、安全的更新操作

为了防止不加where条件的update语句被执行,需要在 /etc/my.cnf 、 ~/.my.cnf 或 --defaults-file 指定的配置文件中加入

[mysql]
safe-updates=TRUE

四、将表移动到另一个库中

-- 方式1
rename table school.student to zwq.student;
-- 方式2
alter table zwq.student rename to school.student;