前言:有一个mysql数据库,由于建库的时候未使用utf8mb4的字符集,导致插入生僻字乱码和报错,经历了2天的查询和测试总结了以下经验供参考。mysql 可以设置数据库级别,表级别,列级别 字符集编码;优先级顺序为:数据库字符集 < 表字符集 < 列字符集;字符集不一致时,以 更小范围的配置为准。

1、建库要规范:首先要明白你的用途,生产一定要提前设置标准,如果是中文建议使用utf8mb4,至于utf8和utf8mb4的区别,简单来说是utf8mb4是4个字节是utf8的超集,可以兼容utf8,可以存特殊字符和表情。

①创建数据库

CREATE DATABASE testmb4 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

注意“testmb4”是你设置的库名

②创建表

CREATE TABLE testtable(id varchar(40) NOT NULL default '',userId varchar(40) NOT NULL default '') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

注意“testtable”是你设置的表名,库和表的字符集设置好了,基本就不会出问题。

2、如果数据库、表已经创建可以直接修改数据库或表的编码格式,但是生产环境要慎重!!!

①修改数据库的编码格式
alter database <数据库名> character set utf8mb4;

②修改数据表格编码格式,风险:锁全表
alter table <表名> character set utf8mb4; 只对表的属性做变更,不对列上的字符集做转换
alter table <表名> convert to character set utf8mb4; 对列上的字符集也做转换

③修改字段编码格式
alter table <表名> change <字段名> <字段名> <类型> character set utf8mb4;

3、mysql字符集常用命令

①查看MYSQL数据库服务器和数据库字符集
show variables like '%character%';
show variables like 'collation%';

②查看MYSQL所支持的字符集
show charset;

③查看数据表的编码
show create table <表名>;

④查看字段的编码
show full columns from <表名>;

⑤查看数据库编码:
SHOW CREATE DATABASE db_name;

4、字符集utf8和utf8mb4的报错现象
①Mysql错误1366的解决办法:Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1原因是UTF-8编码有可能是两个、三个、四个字节,Emoji表情或者某些特殊字符是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。
解决方案:
第一种就是urlencode后存入数据库 读取的时候再urldecode
第二种数据库字段改成utf8mb4,注意数据库的连接方式也要改成utf8mb4

5、数据库常用命令
①show databases;查看所有的数据库,等同于select schema_name from information_schema.schemata\G。\G 替换;,以纵向报表的形式输出结果,有利于阅读。

②status 查看mysql数据库的运行状态

③use 命令选择数据库 例如 use information_schema,当使用此命令后select schema_name from information_schema.schemata\G,可以为select schema_name from schemata\G

④查看数据库中的表
show tables 同样也可以在information_schema中查看,show命令是方便使用的简短模式。
select table_name from tables where table_schema='jblog';

⑤查看表结构
desc table_name;

⑥查看表状态
show table status from db like 条件
可以查看engine数据库引擎,version,row、index等信息

⑦小技巧,当多行命令输入,发现错误后,用\c结束。

⑧查询数据库连接
show full processlist;
show status like '%Max_used_connections%';
show status like '%Threads_connected%';#当前连接数
show status like '%table_lock%';#表锁定
show status like 'innodb_row_lock%';#行锁定
show status like '%qcache%'; #查询缓存情况
show variables like "%query_cache%";
SHOW STATUS LIKE 'Qcache%';
show variables like "%binlog%";
show status like 'Aborted_clients';#由于客户没有正确关闭连接已经死掉,已经放弃的连接数量
show variables like '%max_connections%';//查看最大连接数量
show variables like '%timeout%';#查看超时时间
show variables like 'log_%'; #查看日志是否启动