设置 MYSQL 数据库编码为 utf8mb4

article/2025/8/31 2:45:36

    utf-8编码可能2个字节、3个字节、4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符。如果直接往采用utf-8编码的数据库中插入表情数据,java程序中将报SQL异常:

    java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94’ for column ‘name’ at row 1

    utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。
    采用utf8mb4编码的好处是:存储与获取数据的时候,不用再考虑表情字符的编码与解码问题。


​1、查询当前数据库字符集​
    SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
​2、设置mysql配置文件/etc/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_general_ci
init_connect='SET NAMES utf8mb4'

​3、重启mysql服务​
    systemctl restart mysqld.service


设置 MYSQL 数据库编码为 utf8mb4_mysql
    ​MySQL 中字符集相关变量 character_set_client:客户端请求数据的字符集
    character_set_connection:从客户端接收到数据,然后传输的字符集
    character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。
    character_set_filesystem:把操作系统上的文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的
    character_set_results:结果集的字符集
    character_set_server:数据库服务器的默认字符集
    character_set_system:存储系统元数据的字符集,总是 utf8,不需要设置
​4、数据库链接参数​
    characterEncoding=utf8mb4&autoReconnect=true
​5、如果已经有数据库和表,可以修改字符集:​

更改数据库编码:
    ALTER DATABASE DATABASE_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
更改表编码:
    ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-----------------------------------
设置 MYSQL 数据库编码为 utf8mb4
 

数据库编码 问题
mysql 修改字符集为utf8mb4
问题 ;
当向数据库插入表,或者在表中插入数据时,出现

    ERROR 1366 (HY000): Incorrect string value: ‘\xBD\xF0\xD3\xB9’ for
    column ‘name’ at row 1

原因 数据库编码方式 和 表编码方式 以及 插入数据(字符串)的编码方式不同

我们可以查看建表,建数据库语句,查看他们的编码

    show create database database_name
    show create table table_name

    也可以使用 show full columns from emp 查看表的最详尽信息

在windows下mysql建表是默认是采用latin字符集
错误解决方式

    将数据库和表的编码换成 utf8mb4 插入表的语句在记事本里另存为 utf8 编码

修改database默认的字符集

    ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE =
    utf8mb4_unicode_ci

虽然修改了database的字符集为utf8mb4,但是实际只是修改了database新创建的表,默认使用utf8mb4,原来已经存在的表,字符集并没有跟着改变,需要手动为每张表设置字符集
修改table的字符集

    只修改表默认的字符集
    ALTER TABLE table_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    修改表默认的字符集和所有字符列的字符集
    ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    单独修改column默认的字符集 ALTER TABLE table_name CHANGE column_name column_name
    VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

注意内容
检查字段的最大长度和索引列

字段长度

由于从utf8升级到了utf8mb4,一个字符所占用的空间也由3个字节增长到4个字节,但是我们当初创建表时,
设置的字段类型以及最大的长度没有改变。例如,你在utf8下设置某一字段的类型为TINYTEXT, 这中字段类型
最大可以容纳255字节,三个字节一个字符的情况下可以容纳85个字符,四个字节一个字符的情况下只能容纳63
个字符,如果原表中的这个字段的值有一个或多个超过了63个字符,那么转换成utf8mb4字符编码时将转换失
败,你必须先将TINYTEXT更改为TEXT等更高容量的类型之后才能继续转换字符编码

索引

在InnoDB引擎中,最大的索引长度为767字节,三个字节一个字符的情况下,索引列的字符长度最大可以达到
255,四个字节一个字符的情况下,索引的字符长度最大只能到191。如果你已经存在的表中的索引列的类型为
VARCHAR(255)那么转换utf8mb4时同样会转换失败。你需要先将VARCHAR(255)更改为VARCHAR(191)才能继续
转换字符编码

修改配置文件

    SET NAMES utf8 COLLATE utf8_unicode_ci becomes SET NAMES utf8mb4
    COLLATE utf8mb4_unicode_ci

    vim /etc/my.cnf
    对本地的mysql客户端的配置

    [client] default-character-set = utf8mb4
    对其他远程连接的mysql客户端的配置

    [mysql] default-character-set = utf8mb4
    本地mysql服务的配置

    [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
    service mysqld restart

检查修改

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| 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               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)

修复&优化所有数据表

    mysqlcheck -u root -p --auto-repair --optimize --all-databases
 


http://chatgpt.dhexx.cn/article/DfiFKlPb.shtml

相关文章

utf8mb4 字符集(4字节 UTF-8 Unicode 编码)

最近做项目遇到APP评论中有 emoji 表情符号,结果导致插入 MySQL 数据库失败,找到 MySQL 官方相关内容,这里斗胆翻译一下。在翻译过程中有些不明白的地方,如BMP、collation等,都找到官方文档,给出了链接&…

UTF-8编码详解

1.ASCII编码 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所 以,一个字节能表示的最大的…

mysql中的utf8与utf8mb4

一、如何设置utf8mb4 mysql中针对字符串类型,在设置charset的时候可以精确到字段。 如果只将某个字段设置utf8mb4,那么其他字段不会受影响。 如果针对表来设置,那么已经存在的字段依然是utf8,并且会多出utf8的标记,…

What is UTF-8?

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击人工智能教程 UTF-8 is a variable-width character encoding standard that uses between one and four eight-bit bytes to re…

图解unicode、utf8和utf8mb4

字符集和字符编码 字符集(CCS: Coded Character Set): 就是一个表格,表示每个字符对应数字(通常用16进制表示),比如unicode字符集中,数字1对应的就是U00031,字母a对应的…

UTF-8

UTF-8编码规则 UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织,所以可以看出unicode是给出一个…

MySQL 数据库字符集 utf8 和 utf8mb4 的区别

MySQL 的 utf8 实际上不是真正的 UTF-8。utf8 只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。 MySQL 一直没有修复这个 bug,他们在 2010 年发布了一个叫作 utf8mb4 的字符集, 绕过了这个问题。当然,他们并…

utf8和utf8mb4的区别

1. 基础知识 1.1 bit , byte , word 字 word 字节 byte (B) 位 bit (b) 1.2 单位换算 1字节 8位(1 byte 8bit) 1字 2字节(1 word 2 byte) 一个汉字 2字节 中文标点 三个字节 一个英文字母 一个字节 英文标点 一个字节 Em…

简单明了!utf8和utf8mb4的区别

一、简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。utf8mb4是utf8 的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用u…

浅谈uf8mb4字符集

要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集(mb4就是most bytes 4的意思,专门用来兼容四字节的unicode),但只有 5.5.3 版本以后的才支持。 为了获取更好的兼容性,应该总是使用 utf…

学习笔记4-K均值聚类算法

K-均值聚类的一般流程 (1)收集数据:可以使用任何方法收集数据 (2)准备数据:需要数值型数据来计算距离,也可以将标称型数据映射为二值型数据再用于距离计算 (3)分析数据…

【吴恩达机器学习-笔记整理】k-means(k-均值聚类算法)

目录: 🌵🌵🌵前言一、应用二、k-means1、参数:2、过程3、应用4、优化目标5、随机初始化6、聚类数量的选择 ❤️❤️❤️忙碌的敲代码也不要忘了浪漫鸭! 🌵🌵🌵前言 ✨你好…

25.K-均值算法的介绍及实现过程

主要内容 K-均值算法的介绍K-均值算法的实现过程K-均值算法的具体例子实现过程 一、K-均值算法的介绍 K-均值(K- means) ** 是最普及的聚类算法**,算法接受一个未标记的数据集,然后将数据聚类成不同的组 聚类算法 是无监督学习…

K-means(K均值聚类算法)算法笔记

K-means(K均值聚类算法)算法笔记 K-means 算法,是比较简单的无监督的算法,通过设定好初始的类别k,然后不断循环迭代,将给定的数据自动分为K个类别。事实上,大家都知道K-means是怎么算的&#x…

K-近邻算法讲解以及实战

1.概述 邻近算法,或者说K最近邻(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。Cover和Hart在1968年提出了最初的…

第十五课.K均值算法

目录 K均值算法原理K均值算法的改进:K-meansnumpy实现K-means K均值算法原理 K均值(K-means)算法属于无监督学习中的聚类算法;聚类是根据样本特征向量之间的相似度或距离,将样本数据划分为若干个样本子集,…

K均值与K近邻算法简析

回顾了一下机器学习的简单算法。 原文链接:https://blog.csdn.net/zll0927/article/details/17000675 K-Means介绍 K-means算法是聚类分析中使用最广泛的算法之一。它把n个对象根据他们的属性分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度…

聚类算法、无监督学习、K均值算法及其优化函数

聚类算法 无监督学习:将无标签样本分为不同的两类或者多类,称为聚类算法 K均值算法 K均值算法是一个迭代算法,共两个步骤 1.簇分配:遍历图中每个样本,根据每个样本点离那个聚类中心近,从而将该样本点分配…

K-means算法-综合整理

A 主要流程 a 随机初始化k个点作为簇质心 b 计算每个点与质心距离(常用欧式距离和余弦距离),并将其分配给最近 的质心对应的簇中 c 重新计算每个簇的质心,更新为所有点的平均值 d 反复迭代b-c步骤,直到达到某个终止条…

K均值聚类算法(Kmeans)讲解及源码实现

K均值聚类算法(Kmeans)讲解及源码实现 算法核心 K均值聚类的核心目标是将给定的数据集划分成K个簇,并给出每个数据对应的簇中心点。算法的具体步骤描述如下。 数据预处理,如归一化、离群点处理等。随机选取K个簇中心,记为 μ 1 ( 0 ) , μ 2…