目录
1. 问题 - MySQL插入表情包符号
2、解决方法
2.1针对字段修改编码格式(推荐使用)
2. 2、整个数据库修改编码格式
3. MySQL字符集
3.1 数据库字符集
3.1.1查看当前数据库字符集配置:
3.1.2 修改数据库编码格式
3.2 表的编码
3.2.1 参看表的编码格式
3.2.2修改表的编码格式
3.3 字段的编码
3.3.1 看字段编码格式
3.3.2 修改字段的编码格式
4. 可能的问题
4.1 ALTER TABLE `tbl` DEFAULT CHARACTER SET utf8 ; 字段编码格式未生效
4.2 对表DDL时,会锁表 -- (pt-online-schema-change)
刚上mysql,经常发生前段传过来的内容入库发生异常,数据库报:
java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x8C\xB8’ for column ‘mechant_name’ at row 1
发现,数据库建表时候,用的是utf8字符集,传进来了表情包,表情包是4个字节的;
通常情况,Mysql数据编码格式为“utf-8”,对于汉字来说足够;Mysql中utf8占3个字节,但是,3个字节对于表情符号是不够的,需4个字节;此时使用utf8,会出现‘\xF0\x9F\x8D\x83\xF0\x9F’的问题。
utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。
数据库表对应字段上修改编码格式为utf8mb4,命令示例如下:
ALTER TABLE insure_user CHANGE nickname nickname VARCHAR(64) CHARACTER SET utf8mb4 ;
修改数据库表的编码格式,修改为utf8mb4;修改Mysql配置文件my.cnf(windows下为my.ini),然后重启数据库
show variables like 'character%'
alter database databasename character set utf8
或者,直接修改mysql的配置文件 my.cnf
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4
show create table table_name
可以输出完整的建表语句,看其中的 “DEFAULT CHARACTER”项;
alter table tablename character set utf8
show full columns from tableName
看 Collation列;
alter table tablename modify fieldname varchar(50) character set utf8
虽然使用 ALTER TABLE `tbl` default character set utf8, 将表的编码格式修改成了utf8; 但是 字段的编码格式并没有修改过来;
修改字段的编码格式:
ALTER TABLE `tablename` CHANGE `字段名1` `字段名2` VARCHAR(36) CHARACTER SET utf8 NOT NULL;
将现有数据,转换成新的编码格式:
alter table `tablename` convert to character set utf8;
MySQL进行DDL操作时(修改字段类型、长度、编码等等,都属于DDL操作),MySQL会锁表;
如果数据量小的表,没有什么影响;如果数据量大(1w条记录以上?),就会对当前表的操作产生明显的影响;尤其是千万级,上亿的表,影响更大;
看介绍,使用 pt-online-schema-change 在线DDL工具,可以减少影响(只是减少影响,而不是完全避免影响);
pt-oneline-schema-change 自己没使用过,搞个链接过来吧,写着挺清晰的
https://www.cnblogs.com/allenhu320/p/11358652.html