数据库编码

前言

在数据库插入操作中,会看到因为非英文字符因字符编码的问题而出错的现象 ERROR 1366
这常常是因为数据库所支持的编码方式与正在使用的客户端的编码方式不同而造成的.
本文参考查看mysql数据库及表编码格式

查看编码

  1. 查看数据库编码

    1
    show variables like '%char%'

    结果如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    +--------------------------+----------------------------+
    | Variable_name | Value |
    +--------------------------+----------------------------+
    | character_set_client | utf8 |
    | character_set_connection | utf8 |
    | character_set_database | latin1 |
    | character_set_filesystem | binary |
    | character_set_results | utf8 |
    | character_set_server | latin1 |
    | character_set_system | utf8 |
    | character_sets_dir | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+

    源头上出问题的就是 character_set_database
    character_set_server 貌似并不影响.

  2. 查看表的编码

    1
    show create table <表名>;

    结果如下:

    1
    2
    3
    4
     CREATE TABLE `student` (
    `sno` int(11) DEFAULT NULL,
    `sname` varchar(20) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1

    可以看到创建 table 时完整的代码,发现字符编码是latin1

修改编码

  1. mysql一次性设置

    1
    SET character_set_database = utf8

    该设置会在重新连接mysql之后失效.

  2. 数据库

    1
    alter database <数据库名> charset utf8;

    character set=同=char set=同=charset

  3. 1
    alter table <表名> charset utf8;
  4. 字段(表中的列)

    1
    mysql>alter table <表名> change <字段名> <字段名> <类型> charset utf8;

    修改源头的编码只能保证*新建的*子项目默认编码为utf8.
    而不能保证现在的内容变为utf8,最终生效的是最后的字段修改.

创建时定义

1
create databse <数据库名> charset utf8;

其他的创建也是可以用 charset utf8 来进行修饰.
但只要源头上更改了,默认创建utf8编码的内容.

系统默认设置

更改了 /etc/mysql/mysql.cnf 文件以及 /etc/mysql/my.cnf 文件中的内容,
[mysql] 字段加入 default_character_set=utf8
[mysqld] 字段加入 character_set_server=utf8
重启mysql服务

备注

set names utf8 设置的等同于

1
2
3
SET character_set_client = utf8;        #客户端用字符集
SET character_set_connection = utf8; #连接用字符集
SET character_set_results = utf8; #返回结果用字符集

如果再有

1
SET character_set_database = utf8;

并且在操作数据库的程序代码文件上也使用utf8的编码,
就基本不会出现乱码问题了.