MySQL字符集(表情包)

 

目录

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)


 

1. 问题 - MySQL插入表情包符号

刚上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’的问题。

 

2、解决方法

        utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。 

 

2.1针对字段修改编码格式(推荐使用)

        数据库表对应字段上修改编码格式为utf8mb4,命令示例如下:

ALTER TABLE insure_user CHANGE nickname nickname VARCHAR(64) CHARACTER SET utf8mb4 ; 

 

 

2. 2、整个数据库修改编码格式

修改数据库表的编码格式,修改为utf8mb4;修改Mysql配置文件my.cnf(windows下为my.ini),然后重启数据库
 

 

3. MySQL字符集

3.1 数据库字符集 

3.1.1查看当前数据库字符集配置:

show variables like 'character%'

MySQL字符集(表情包)_第1张图片

 

3.1.2 修改数据库编码格式

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

3.2 表的编码 

3.2.1 参看表的编码格式

show create table table_name

可以输出完整的建表语句,看其中的 “DEFAULT CHARACTER”项;

3.2.2修改表的编码格式

alter table tablename character set utf8

 

3.3 字段的编码

3.3.1 看字段编码格式

show full columns from tableName

MySQL字符集(表情包)_第2张图片

看 Collation列;

3.3.2 修改字段的编码格式

alter table tablename modify fieldname varchar(50) character set utf8

 

4. 可能的问题

4.1  ALTER TABLE `tbl` DEFAULT 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;

4.2 对表DDL时,会锁表 -- (pt-online-schema-change)

MySQL进行DDL操作时(修改字段类型、长度、编码等等,都属于DDL操作),MySQL会锁表;

如果数据量小的表,没有什么影响;如果数据量大(1w条记录以上?),就会对当前表的操作产生明显的影响;尤其是千万级,上亿的表,影响更大;

看介绍,使用 pt-online-schema-change 在线DDL工具,可以减少影响(只是减少影响,而不是完全避免影响);

pt-oneline-schema-change 自己没使用过,搞个链接过来吧,写着挺清晰的

https://www.cnblogs.com/allenhu320/p/11358652.html

 

 

 

你可能感兴趣的:(db,技术区)