12 mysql char/varchar 的数据存储

news2024/11/18 15:40:56

前言

这里主要是 由于之前的一个 datetime 存储的时间 导致的问题的衍生出来的探究 

探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储 

本文主要 的相关内容是 char 类类型的相关数据的存储  

这部分数据 客户端 和 服务器这边的交互 主要是以字符串的形式交互 

服务器这边的存储 主要是 按照特定的编码进行存储 

 

 

mysql 中 char 的服务器客户端的数据交互

测试表结构如下

CREATE TABLE `tz_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `field1` char(6) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

INSERT INTO `test`.`tz_test`(`id`, `field1`) VALUES (1, '123456');

 

测试脚本如下 

package com.hx.test07;

/**
 * Test06MysqlTimezone
 *
 * @author Jerry.X.He
 * @version 1.0
 * @date 2023/4/24 16:26
 */
public class Test06MysqlTimezone {

    // Test06MysqlTimezone
    public static void main(String[] args) {

        String url = "jdbc:mysql://10.60.50.16:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&autoReconnectForPools=true&useSSL=false";
        String username = "root";
        String password = "root";
        JdbcTemplate jdbcTemplate = Test14GenExpertSql.getMysqlJdbcTemplate(url, username, password);

        String sql = " select * from tz_test; ";
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
        int x = 0;


    }

}

 

mysql 是将给定的 char 的数据以 字符串的形式 交互给客户端的

mysql 服务器中对应的类型为 STRING

37ec3fda5a424feb9b1780ee3bc52bdc.png

 

与客户端的交互, 本身存放的就是 目标字符串 按照指定的编码存放的 字节序列

这里 直接响应 原数据 即可

88d1e58e50af49ee93f01aeeec907ff3.png

 

 

mysql 服务器 char 的存储

比如 这里我传入的是 “999999999”, 原始数据是 “888888888”

输入的字符集是 utf8_mb4_general_ci, 目标字段的字符集是 latin1_swedish_ci

然后这里的编码的转换处理是以 unicde 作为媒介进行的转换, utf8_mb4_general_ci 转换为 unicode, 然后再转换为 latin1_swedish_ci 的编码, 然后存储在 to 的位置

那么字符的存储就是以 这种编码来进行存储的

并且 如果长度不够 fieldLength, 则填充 空格至长度为 fieldLength, fieldLength 指的是字符的长度 

eb61c5e5f5424497996279a4df5891e8.png

处理之后, 给定的字段 更新成为了 “999999999 ”

dd162c4b5f1a470fac81de0d317c7486.png

 

 

这里编码的转换多提一句 

假设我这里设置的字段的编码集为 gbk 呢 ?

“你好” 中, 将 “你” 转换为 unicode 为 20320, 然后再转换为 gbk 存储 

bb6669cc01d740fbb1ee2a5027c09693.png

 

"你" 的 unicode, 以及 utf8 表示, 以及 gbk 表示 

ceb4b6a8899d40a3b034d8c9850402ea.png

 

 转换之后情况如下, 然后 我们来看一下 from 和 to 的相关信息 

可以看到的是 "你" 按照了字段的编码集 gbk 转换为了字节存储 

60b18a67f79b48f7aa56fd7f6e6172c9.png

eb966918fe934246b74e18553cdc4af5.png

 

假设我这里设置的字段的编码集为 latin-1 呢 ?

目标编码集 latin-1 不兼容于 unicode 中的 "你" 的中文表述, 这里 mysql 将 "你" 更新为了 "?" 然后进行存储, 同样 "好" 也存储为了 "?" 

这是一种不可逆的数据丢失 

bd8533d1d4544cc19bf317315cec7d3a.png

 

查看数据记录, 发现 field1 为 "??" 

 e840ada0eef64bd9bd862a18ebf4d75b.png

 

 

mysql 中 varchar的服务器客户端的数据交互

和上面 char 相同 

mysql 服务器中对应的类型为 VAR_STRING

b960a787bb1046ef89e9e1712ce17f12.png

 

与客户端的交互, 本身存放的就是 目标字符串 按照指定的编码存放的 字节序列

这里 直接响应 原数据 即可

0c0d8a906ca4448589c492ce11f7072f.png

 

 

mysql 服务器 varchar 的存储

比如 这里我传入的是 “999999999”, 原始数据是 “888888888”

输入的字符集是 utf8_mb4_general_ci, 目标字段的字符集是 latin1_swedish_ci

然后这里的编码的转换处理是以 unicde 作为媒介进行的转换, utf8_mb4_general_ci 转换为 unicode, 然后再转换为 latin1_swedish_ci 的编码, 然后存储在 to 的位置

那么字符的存储就是以 这种编码来进行存储的 

和上面 char 同理, char 如果长度不够 fieldLength 需要填充空格, varchar 存储是存储长度 和 具体的数据, fieldLength 指的是字符的长度 

c3f214fcdd2942bc8ba9e5a677c43d8c.png

 

处理之后, 给定的字段 更新成为了 “999999999”

b3cda61153c64795838ef97d747de339.png

 

 

 

 

 

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

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

相关文章

python常用包/库

目录 NumpypandasMatplotlibSeabornScikit-learnKerasOpenCV Numpy NumPy库是Python中一个广泛使用的数学库&#xff0c;主要用于处理多维数组和矩阵。它提供了许多用于数组操作的功能&#xff0c;包括数组创建、索引、切片、广播、数学运算、统计分析等。NumPy库还提供了许多…

3D点云处理:点云形态学腐蚀运算

文章目录 0. 测试效果1. 基本内容1.1 2D方法对点云进行腐蚀运算1.2 3D方法对点云进行腐蚀运算文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_目标:去除点云的边缘噪声等;0. 测试效果 红色为腐蚀后的点云;白色为原始点云; 1. 基本内容 点云腐蚀是一种用于处理三维…

2.2 Vector<T> 动态数组(模板语法)

C数据结构与算法 目录 本文前驱课程 1 C自学精简教程 目录(必读) 2 动态数组 Vector&#xff08;难度1&#xff09; 其中&#xff0c;2 是 1 中的一个作业。2 中详细讲解了动态数组实现的基本原理。 本文目标 1 学会写基本的C类模板语法&#xff1b; 2 为以后熟练使用 S…

新功能上线!Salesforce Field Service人工智能创新

Salesforce Field Service是Service Cloud的扩展&#xff0c;可提供员工管理的全面视图。Field Service专为进行现场服务的员工而设计&#xff0c;例如服务技术人员、服务座席、调度员等。随着Salesforce平台上线越来越多的生成式AI新增功能&#xff08;包括Sales Cloud、Marke…

Python学习教程:进程的调度

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 要想多个进程交替运行&#xff0c;操作系统必须对这些进程进行调度&#xff0c; 这个调度也不是随即进行的&#xff0c;而是需要遵循一定的法则&#xff0c;由此就有了进程的调度算法。 python更多源码/资料/解答/教程等 …

练习2:88. 合并两个有序数组

这里写自定义目录标题 题目解体思路代码 题目 给你两个按非递减顺序排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m和 n &#xff0c;分别表示 nums1 和 nums2中的元素数目。 请你合并nums2 到 nums1 中&#xff0c;使合并后的数组同样按非递减顺序排列。 注意&a…

python 笔记(3)——request、爬虫、socket、多线程

目录 1、使用requests发送http请求 1-1&#xff09;发送get请求 1-2&#xff09;发送 post 请求 1-3&#xff09;发送 get 请求下载网络图片 1-4&#xff09;使用 post 上传文件 1-5&#xff09;自动维护 session 的方式 2、使用 os.popen 执行cmd命令 3、基于 beautif…

01_nodejs简介

01 【nodejs简介】 1.前言 Node 的重要性已经不言而喻&#xff0c;很多互联网公司都已经有大量的高性能系统运行在 Node 之上。Node 凭借其单线程、异步等举措实现了极高的性能基准。此外&#xff0c;目前最为流行的 Web 开发模式是前后端分离的形式&#xff0c;即前端开发者…

ArrayList、LinkedList、Collections.singletonList、Arrays.asList与ImmutableList.of

文章目录 ListArrayListLinkedListArrayList与LinkedList的区别快速构建list集合Collections.singletonListArrays.asListImmutableList.of Java集合类型有三种&#xff1a;set(集)、list(列表)和map(映射)&#xff0c;而List集合是很常用的一种集合类型&#xff0c; List 我…

2.3 Vector 动态数组(迭代器)

C数据结构与算法 目录 本文前驱课程 1 C自学精简教程 目录(必读) 2 Vector<T> 动态数组&#xff08;模板语法&#xff09; 本文目标 1 熟悉迭代器设计模式&#xff1b; 2 实现数组的迭代器&#xff1b; 3 基于迭代器的容器遍历&#xff1b; 迭代器语法介绍 对迭…

电影《封神第一部》观后感

本周看了电影《封神第一部》&#xff0c;听说上映的时候&#xff0c;口碑就是非常不错的&#xff0c;算是补档吧&#xff0c;另外看网上的一些评论&#xff0c;也都似乎挺好的&#xff0c;虽然有段时间了&#xff0c;还是决定去看看&#xff0c;其实也是算是逃避新出的电影吧&a…

亚马逊的邮箱可以更改吗,修改亚马逊账户邮箱的方法

亚马逊的邮箱可以更改吗&#xff1f; 可以更改&#xff0c;但更改主户邮箱需要电话对身份进行深度验证。如果需要修改&#xff0c;可以先开case向客服说明情况&#xff0c;然后根据客服的指导步骤来操作即可。 修改亚马逊账户邮箱的方法 1、登录您的账户&#xff1a;打开亚马…

外贸爬虫系统

全球智能搜索 全球智能搜索 支持全球所有国家搜索引擎&#xff0c;及社交平台&#xff0c;精准定位优质的外贸客户&#xff0c;免翻墙 全球任意国家地区实时采集 搜索引擎全网邮箱电话采集 社交平台一键查看采集&#xff08;Facebook,Twitter,Linkedin等&#xff09; 职位…

Android SDK 上手指南||第九章 Manifest文件

第九章 Manifest文件 到目前为止&#xff0c;我们已经熟悉了Android项目中的各个组成部分&#xff0c;包括其资源。在今天的文章中&#xff0c;我们将以项目Manifest文件作为核心内容。 对于一个项目来说&#xff0c;Manifest既可以很简单、也可以很复杂&#xff0c;其具体情…

k8s环境部署配置

目录 一.虚拟机准备 二.基础环境配置&#xff08;各个节点都做&#xff09; 1.IP和hosts解析 2.防火墙和selinux 3.安装基本软件 4.配置时间同步 5.禁用swap分区 6.修改内核参数并重载 7.配置ipvs 三.docker环境&#xff08;各个节点都做&#xff09; 1.配置软件源并…

Sharding-JDBC介绍及分库分表实践

1.1 ShardingSphere简介 最早是当当网内部使用的一款分库分表框架&#xff0c;名字叫Sharding-JDBC&#xff0c;定位为轻量级 Java 框架&#xff0c;在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库&#xff0c;以 jar 包形式提供服务&#xff0c;无需额外部署和依…

【Ant Design】Form.Item创建自定义表单

一、概述 Antd是一个非常强大的UI组件库&#xff0c;里面的Form表单组件也基本能满足我们大多数场景。但是也有需要自定义表单的场景。 Vue2里我们使用v-model&#xff0c;结合子组件的model属性&#xff0c;来实现自定义组件的双向绑定。 Vue3里我们使用v-model&#xff0c;…

AGCTF 2023陇剑杯wp

SSW SmallSword_1 导出HTTP 对象的时候发现有sql 注入的语句&#xff0c;猜测攻击手法是 sql 注入 在这里发现了可疑的 php 文件 追踪 15340 发现可控参数&#xff0c;也就是连接密码 Flag&#xff1a;flag{0898e404bfabd0ebb702327b19f} SmallSword_2 知道攻击手法&…

Nacos整合Feign远程调用

Feign使用 Feign是一个声明式的http客户端&#xff0c;其作用就是帮助我们优雅的实现http请求的发送。 将Feign的Client抽取为独立模块&#xff0c;并且把接口有关的POJO、默认的Feign配置都放到这个模块中&#xff0c;提供给所有消费者使用。 例如&#xff0c;将UserClien…

vue小测试之拖拽、自定义事件

在开始之前我去复习了一下&#xff0c;clientX、clientY、pageX、pageY的区别&#xff0c;对于不熟悉offsetLeft和offsetTop的也可以在这里去复习一下。 vue拖拽指令之offsetX、clientX、pageX、screenX_wade3po的博客-CSDN博客_vue offset 客户区坐标位置&#xff08;clientX&…