MySQL alter命令详解(更改字符编码设置以及字段设置)
可能会有这样的需求,比如做WordPress二次开发,默认的WordPress数据库的表可能编码格式不是自己所希望的,比如,原来是utf8,可是表已经建好了,改成utf8mb4,想更改怎么办?或者某个字段并不是非空的,想改变为非空的,怎么办?
首先来说说数据库编码问题。 数据库是由库和表组成,在MySQL中,库是用database表示,表是使用table表示,外部引入的数据库和表的编码可能不会和本地的数据库表编码一致,数据库的编码是由MySQL最重要的配置文件(没有之一)my.cnf所控制,
该文件内分为很多标签,类似Samba这样的服务的配置文件(也可以这么想象为Samba配置文件),mysqld标签和mysql标签分别表示服务端和客户端,需要在这两个标签内定义一致的编码设定,也就是这个设定,
default-character-set=utf8mb4
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci, mysqld标签需要这三个键值对,mysql只需要第一个键值对。
进入MySQL后,执行命令:
mysql> show variables like "%char%";
+--------------------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------------------+----------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
| validate_password_special_char_count | 1 |
+--------------------------------------+----------------------------------+
9 rows in set (0.00 sec)
值都一致即为数据库编码设定正常
外部引入的数据库以及表不和所设定的编码一致呢?比如,我现在有一个表,表名是u_name,这个表的编码为gbk,和我my.cnf文件内的设定不一致,怎么改?进入数据库,执行命令:
mysql> ALTER TABLE `u_name` CONVERT TO CHARACTER SET UTF8MB4;
Query OK, 25 rows affected (0.04 sec)
Records: 25 Duplicates: 0 Warnings: 0
在执行命令:
mysql> show create table u_name;
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| u_name | CREATE TABLE `u_name` (
`userid` int(11) NOT NULL AUTO_INCREMENT,
`firstname` varchar(50) NOT NULL,
`lastname` varchar(50) NOT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 |
可以看到,表的编码方式已经改变了。
改变表结构,想设置 firstname 的值可以为空,怎么办?
执行命令:
mysql> alter table `u_name` modify firstname varchar(40) default null;
Query OK, 25 rows affected (0.04 sec)
Records: 25 Duplicates: 0 Warnings: 0
mysql> show create table u_name;
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| u_name | CREATE TABLE `u_name` (
`userid` int(11) NOT NULL AUTO_INCREMENT,
`firstname` varchar(40) DEFAULT NULL,
`lastname` varchar(50) NOT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
=================================================================================
总结:
其实用到的命令不多,查询建表的时候这个表的命令:show create table 表名;检验表的编码,非空,主键等信息、
查看整体编码变量值,show variables like "%char%";
更改表内编码,alter table `表名` convert to character set 编码; 注意,表名是反引号括起来的,别的不行哦。
更改表内其他值,alter table `表名` modify 字段名 varchar(40) default null;