MySQL中的字符集和排序规则

news2024/11/25 12:50:34

关键字: 字符集,utf8mb4,emoj

众所周知,mysql的utf8是假的utf8,没法存emoj等字符。要设置为utf8mb4...


问题


同事给了一段Update语句,更新某张表id=xxx的某个字段;


CREATE TABLE `table_name` (
  `id` int(11NOT NULL AUTO_INCREMENT,
  `xxx_id` int(11NOT NULL,
  `description` longtext COLLATE utf8mb4_unicode_ci NOT NULL,
  `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `end_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `max_xxx` int(11NOT NULL DEFAULT '0',
  `max_xxx` int(11NOT NULL DEFAULT '0',
  `xxx_generate_method` tinyint(4NOT NULL,
  `xxx_generate_method` tinyint(4NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_table_name_xxx_id` (`xxx_id`),
  KEY `idx_table_name_end_time` (`end_time`),
  KEY `idx_table_name_start_time` (`start_time`)
ENGINE=InnoDB AUTO_INCREMENT=5822 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

登陆跳板机,连接远程数据库后,执行sql,报错: ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x93\xA3Ev...'

\xF0\x9F\x93\xA3恰好是转义之后的emoj

这张表所在的库的字符集是utf8,但是表指定了是utf8mb4,字段没有指定,仅指定了排序方式为utf8mb4_unicode_ci

据说,字符集规则会按照 字段设置>表设置>库设置的顺序。

此处 这个字段没有设置字符集,那应该用表的字符集即*DEFAULT CHARSET=utf8mb4 *

(且经过试验,如果COLLATE=utf8mb4_unicode_ci,那字符集不可能是utf8,只可能是utf8mb4,不然报错时会直接报错)


下面补充一些mysql字符集的知识


查看库级别的 字符集和编码设置


SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
alt
alt
Variable_name
character_set_client
character_set_connection
character_set_database
character_set_filesystem
character_set_results
character_set_server
character_set_system
character_sets_dir 

这都是干啥的?

这些变量是 MySQL 中与字符集相关的变量,用于控制不同环境中的字符集设置。以下是对每个变量的简要说明:

  1. character_set_client: 客户端连接到 MySQL 服务器时所使用的字符集。
  2. character_set_connection: 当前连接的默认字符集。它可以在客户端连接时通过 SET NAMES 命令来设置。
  3. character_set_database: 默认数据库的字符集。在创建数据库时设置,新创建的表将继承该字符集。
  4. character_set_filesystem: 文件系统的默认字符集。用于存储文件名和路径的字符集。
  5. character_set_results: 返回给客户端的结果集的字符集。
  6. character_set_server: MySQL 服务器的默认字符集。用于新建数据库、表和列的默认字符集。
  7. character_set_system: MySQL 系统数据字典和内部字符串的字符集。
  8. character_sets_dir: MySQL 字符集定义文件的目录路径。

这些变量的设置是相互关联的,通过调整它们的值可以控制 MySQL 在不同环境中的字符集行为。确保这些变量的值一致并与你的应用程序和数据的字符集一致,可以确保正确地存储、传输和显示数据。

注意:在修改这些字符集相关的变量之前,请确保了解其含义和影响,并在备份数据的情况下谨慎操作。修改字符集设置可能会对现有数据和应用程序产生影响。


一般说的字符集和排序规则,应该主要看

SHOW VARIABLES LIKE 'character_set_database';
SHOW VARIABLES LIKE 'collation_database';

查看表级别的字符集和编码设置


SHOW CREATE TABLE `your_table_name`;

能得到建表语句,看最后的DEFAULT CHARSET


具体到table的column的字符集如何查看?

SHOW FULL COLUMNS FROM your_table_name;

在查询结果中,查找 "Collation" 列。该列显示每个列(字段)的字符集和排序规则。

请注意,"Collation" 列中的值表示字符集和排序规则的组合。常见的字符集包括 UTF-8(如 utf8mb4)和 Latin1(如 latin1)。

alt
alt
alt

Collation 本意是校勘,校对之意,在数据库中 是排序规则

这个字段的第一部分,其实已经指明了字符集...所以SHOW FULL COLUMNS没有必要再多一个字符集列


那么,问题何在呢?


起初搜到,需要在连接时指定为utf8mb4才可以

mysql --default-character-set=utf8mb4 -u root -h xxx.xxx.xx.xx -p密码

但还是不行...

最后发现执行 SET NAMES utf8mb4后再执行更新语句,成功!

根据报错信息,看起来在尝试更新xxxxx表中的xxxxxxx字段时遇到了错误。报错信息是ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x93\xA3Ev...' for column 'xxxxxxx' at row 1,这表明在该字段中插入了无效的字符。

尽管您已经将该字段的字符集设置为utf8mb4,支持存储四字节的UTF-8字符,但有可能连接或会话的字符集设置仍然不兼容。为了确保字符集一致,您可以尝试执行以下操作:

  1. 在更新语句之前,执行以下SQL语句设置会话字符集为 utf8mb4
SET NAMES utf8mb4;
  1. 然后,再执行更新语句:
UPDATE `xxxxx` SET `xxxxxxx` = '...' WHERE (`id` = 5136);

通过这样的设置,会话的字符集将与字段的字符集一致,可以正常存储包含四字节UTF-8字符的字符串。

如果问题仍然存在,请确保数据库连接和客户端工具的字符集设置与字段的字符集设置一致。另外,您还可以检查MySQL服务器的全局字符集设置,以确保它也是utf8mb4



SET NAMES utf8mb4什么?


"SET NAMES utf8mb4" 是一个MySQL命令,用于设置数据库连接的字符集编码为utf8mb4。在MySQL中,字符集决定了数据库如何存储和处理数据。

utf8mb4是一种字符集编码,支持Unicode字符集的全部字符,包括一些较早版本的utf8字符集无法表示的一些字符。utf8mb4编码可以处理各种语言的文字和符号,包括一些较为特殊的字符,如表情符号和特殊符号等。

通过将数据库连接的字符集编码设置为utf8mb4,可以确保数据库可以正确地存储、检索和显示各种字符,避免出现乱码或字符丢失的问题。这在处理多语言或包含特殊字符的应用程序中特别重要。

只对当前连接有效吗?

是的,"SET NAMES utf8mb4" 命令只对当前数据库连接有效。这意味着只有在执行该命令后建立的数据库连接会使用 utf8mb4 字符集编码。

如果你在程序中使用了多个数据库连接,每个连接都需要单独执行 "SET NAMES utf8mb4" 命令来设置字符集编码。

另外,如果你希望永久地将数据库的字符集编码设置为 utf8mb4,你需要修改数据库的默认字符集配置。这样,在新建的数据库连接中不需要再手动执行 "SET NAMES utf8mb4" 命令,因为连接会默认使用数据库的字符集配置。请注意,在修改数据库的默认字符集之前,请确保备份数据和相应的预防措施。


结论


可能是:数据库是utf8,即便我在连接时指定--default-character-set=utf8mb4,依然会用utf8,必须要通过SET NAMES utf8mb4 再设置一次

为了验证,通过 mysql --default-character-set=utf8mb4 -u root -h xxx.xxx.xx.xx -p密码连接mysql,select 刚才更新成功的那条记录,发现emoj无法正常显示; 执行SET NAMES utf8mb4 后,再select能正常看到emoj


设置mysql数据库的字符集和编码设置(谨慎操作,一般不要乱改)


要设置 MySQL 数据库的字符集和编码设置,你可以采取以下步骤:

  1. 登录到 MySQL 数据库服务器,可以使用以下命令:

    mysql -u your_username -p

    替换 your_username 为你的数据库用户名。

  2. 在登录后,可以执行以下命令来查看当前的字符集和编码设置:

    SHOW VARIABLES LIKE 'character_set%';
    SHOW VARIABLES LIKE 'collation%';

    这将显示当前的字符集和编码设置。

  3. 若要修改数据库的字符集和编码设置,可以执行以下命令(以utf8mb4为例):

    ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    替换 your_database_name 为你要修改的数据库名称。

  4. 如果需要修改特定表的字符集和编码设置,可以执行以下命令(以utf8mb4为例):

    ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    替换 your_table_name 为你要修改的表名称。

  5. 如果你希望新创建的表默认采用特定的字符集和编码,可以在创建表时指定:

    CREATE TABLE your_table_name (
      ...
    ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

    替换 your_table_name 为你要创建的表名称,并根据需要修改其他表的列和选项。

  6. 重启 MySQL 服务以使更改生效,具体的重启方式取决于你的操作系统和安装方式。

请注意,修改字符集和编码设置可能会影响现有数据和应用程序,因此在进行任何更改之前,请确保备份数据库并谨慎操作。

如何 修改数据库的默认字符集配置

要修改数据库的默认字符集配置,你需要执行以下步骤:

  1. 登录到你的MySQL数据库服务器。
  2. 执行以下命令来打开MySQL的配置文件(通常是my.cnf或my.ini):
    sudo nano /etc/mysql/my.cnf
    如果你使用的是Windows系统,则路径可能是 C:\ProgramData\MySQL\MySQL Server X.X\my.ini,其中X.X代表你的MySQL版本号。
  3. 在配置文件中找到 [mysqld] 部分。
  4. 添加或修改以下两行来设置默认字符集编码为 utf8mb4:
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    上述配置将字符集设置为 utf8mb4,同时使用了 utf8mb4_unicode_ci 校对规则。你也可以选择其他适合你的校对规则。
  5. 保存并关闭配置文件。
  6. 重新启动MySQL服务以使配置生效,可以使用适合你的操作系统的命令,例如:
    • 在Linux上使用:
      sudo systemctl restart mysql
    • 在Windows上使用:
      net stop MySQL
      net start MySQL
  7. 现在,新建的数据库连接将默认使用 utf8mb4 字符集编码。

请注意,修改数据库的默认字符集可能会对现有的数据库和数据产生影响。在执行这些步骤之前,请确保备份数据并采取相应的预防措施。


mysql set names 命令和 mysql 字符编码问题

理解MySQL中的字符集和排序规则

TiDB-字符集和排序规则

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/994673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OLED透明屏厚度:引领未来显示技术的革命

OLED透明屏作为一种未来显示技术,其薄度在整个行业中具有重要意义。 在这篇文章中,尼伽将详细介绍OLED透明屏厚度的优势、技术挑战以及应用案例,旨在为读者全面了解OLED透明屏的发展前景。 一、OLED透明屏厚度的优势 OLED透明屏采用柔性基板…

在FPGA上快速搭建以太网

在本文中,我们将介绍如何在FPGA上快速搭建以太网 (LWIP )。为此,我们将使用 MicroBlaze 作为主 CPU 运行其应用程序。 LWIP 是使用裸机设计以太网的良好起点,在此基础上我们可以轻松调整软件应用程序以提供更详细的应用…

zemax多重结构仿真分光板

光路中的分光板需要使用多重结构来仿真 首先做一个倾斜的分光板,然后用多重结构表现两个光路 基础设置: 效果: 设置平板倾斜45度: 1、表面设置为倾斜面 2、y方向正切设置为1 效果: 设置多重结构,这里是…

【100天精通Python】Day56:Python 数据分析_Pandas数据清洗和处理(删除填充插值,数据类型转换,去重,连接与合并)

目录 数据清洗和处理 1.处理缺失值 1.1 删除缺失值: 1.2 填充缺失值: 1.3 插值: 2 数据类型转换 2.1 数据类型转换 2.2 日期和时间的转换: 2.3 分类数据的转换: 2.4 自定义数据类型的转换: 3 数…

数学分析:势场

首先从散度的物理解释开始。首先,在球内的向量场的散度的积分,等于它在球边界上的流量的积分。所以根据积分中值定理,我们可以这么理解散度,它就是这个体积内的速度场的平均密度。而速度场只和源有关,所以它表示的某个…

Prometheus+Grafana 搭建应用监控系统

一、背景 完善的监控系统可以提高应用的可用性和可靠性,在提供更优质服务的前提下,降低运维的投入和工作量,为用户带来更多的商业利益和客户体验。下面就带大家彻底搞懂监控系统,使用Prometheus Grafana搭建完整的应用监控系统。 …

Leetcode---361周赛

题目列表 2843. 统计对称整数的数目 2844. 生成特殊数字的最少操作 2845. 统计趣味子数组的数目 2846. 边权重均等查询 一、统计对称整数的数目 这题看一眼数据范围,直接就可以开始暴力求解了,按照题目要求模拟就行,代码如下 class Solu…

使用纯C语言定义通用型数据结构的方法和示例

文章目录 前言以实现优先队列来描述实现思想基本类型的包装类型比较函数演示总结 前言 最近一段时间在复习数据结构和算法,用的C语言,不得不说,不学个高级语言再回头看C语言根本不知道C语言的强大和完美,不过相比之下也有许多不便…

Linux内核分析与应用

Linux 内核分析与应用[1] 蜻蜓点水,可作抛砖引玉 1.概述 用到的几个命令: insmod dmesg[2] lsmod[3] 章节测试: 部分可参考[4] <1>. Linux得以流行&#xff0c;是因为遵循了GPL协议&#xff0c;并不是因为遵循POSIX标准 (错) linux操作系统概述[5] linux概述[6] <2>…

建站系列(三)--- 网络协议

目录 相关系列文章前言一、定义二、术语简介三、协议的组成要素四、网络层次划分五、常见网络协议划分六、常用协议介绍&#xff08;一&#xff09;TCP/IP&#xff08;二&#xff09;HTTP协议&#xff08;超文本传输协议&#xff09;&#xff08;三&#xff09;SSH协议 相关系列…

robotframework 获取当前时间

1、获取年月日时分秒格式的数据 命令&#xff1a;${time} Get Current Date result_format%Y%m%d%H%M%S 日期时间显示结果显示形式&#xff1a;20230908102553 2、获取时间戳形式的数据 命令&#xff1a; ${time} Get Current Date result_formattimestamp …

私有gitlab的搭建和配置教程

文章目录 1. 说明2. 安装操作2.1 依赖项2.2 gitlab-ce2.3 简要配置2.4 网页操作2.5 中文配置2.6 其他操作 3. 配置https3.1 配置证书3.2 url配置3.3 网页访问3.4 认证错误 4. ssh操作4.1 生成文件4.2 web配置4.3 额外操作 1. 说明 此教程基于Ubuntu22.04进行阐述&#xff0c;只…

# Spring MVC与RESTful API:如何设计高效的Web接口

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

【MySQL】详解聚合查询、多表查询

MySQL 增删查改&#xff08;进阶&#xff09; 文章目录 MySQL 增删查改&#xff08;进阶&#xff09;01 表的设计表的三大范式 02 查询操作进阶新增聚合查询countsumavgmaxmin 分组查询 GROUP BYHAVING 联合查询/多表查询关键思路引入内连接外连接左外连接&#xff1a;left joi…

WAMP服务器对python进行配置

WAMP服务器中安装python WAMP服务器中安装python 步骤 D:\wamp\bin\apache\Apache2.4.4\conf\httpd.conf // 打开找到Wamp安装目录下&#xff0c;apache的配置文件 将该配置文件备份一份 LoadModule cgi_module modules/mod_cgi.so // 找到配置文件中该行&#xff0c;把行前面…

探索OLED透明屏触摸技术:创新引领智能生活的未来

OLED透明屏触摸技术作为一项创新技术&#xff0c;正在引领智能生活的未来。’ 通过将透明屏和触摸技术相结合&#xff0c;OLED透明屏触摸设备不仅具备了OLED显示屏的优势&#xff0c;还具备了触摸操作的便利性&#xff0c; 在这里&#xff0c;尼伽将介绍OLED透明屏触摸技术的…

Linux教程||Linux 系统启动过程

Linux 系统启动过程 linux启动时我们会看到许多启动信息。 Linux系统的启动过程并不是大家想象中的那么复杂&#xff0c;其过程可以分为5个阶段&#xff1a; 内核的引导。运行init。系统初始化。建立终端 。用户登录系统。 内核引导 当计算机打开电源后&#xff0c;首先是B…

Apache Hive之数据查询

文章目录 版权声明数据查询环境准备基本查询准备数据select基础查询分组、聚合JOINRLIKE正则匹配UNION联合Sampling采用Virtual Columns虚拟列 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相关权利…

Linux指令二【进程,权限,文件】

进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程&#xff0c;是操作系统进行 资源分配和调度的一个独立单位&#xff0c;是应用程序运行的载体。 一、进程基本指令 1.ps&#xff1a;当前的用户进程 ps 只显示隶属于自己的进程状态ps -aux 显示所有进程…

JavaScript基础入门之输出

目录 目录 前言 系列文章列表 JavaScript初学 思维导图 1&#xff0c;如何在Edge浏览器中执行 JavaScript 1.1,首先按F12 1.2,使用控制台窗口调试js代码 1.2.1,如何使用 1.2.2,进行js测试使用 1.3,Edge小脚本 1.3.1,如何创建脚本 1.3.2,运行脚本 2&#xff0c;Ja…