IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【MySQL】官方正解 - char 和 varchar 的区别 -> 正文阅读

[大数据]【MySQL】官方正解 - char 和 varchar 的区别

varchar 和 char 的区别

最初的需求就是为了能存储字符串,字符串怎么存储呢?无非就是一个字符数组嘛。

在 C 语言中,对于字符串的表示是怎么做的呢?

  1. 定长的字符数组
  2. 字符类型指针(char *

回到正题,MySQL中字符串的存储,MySQL是做数据库用的,也就是存储数据,而为了对数据进行约束、存储、解析,就需要存在一个表的结构(类似于structclass

考虑实际中的问题,假如以姓名来说,有少部分人的名字较长,有的有只有2个字符,如果为所有人都分配最长的字符长度的字符数组,那很大一部分不就浪费了嘛。于是我们就想能够存储的时候根据实际存储的值的大小进行分配存储空间,这完全是可行的嘛。所以 char --- varcahr两种普通字符串的存储方式。

下面看官方文档中所述:

????????The CHAR?and VARCHARtypes are similar, but differ in the way they are stored and retrieved. They also differ in maximum length and in whether trailing spaces are retained.

????????char 和 varchar 是很相似的,但是他们再存储方式和检索方式上是不同的,除此之外,他们的最大长度和是否保留尾随的空格上也是不同的

????????The CHARand VARCHARtypes are declared with a length that indicates the maximum number of characters you want to store. For example, CHAR(30) can hold up to 30 characters.

????????The length of a CHAR column is fixed to the length that you declare when you create the table. The length can be any value from 0 to 255. When CHAR values are stored, they are right-padded with spaces to the specified length. When CHAR values are retrieved, trailing spaces are removed unless the PAD_CHAR_TO_FULL_LENGTH SQL mode is enabled.

????????char 和 varchar 通过一个数字声明该列存储的字符数

????????char 的长度将会是固定的,其长度是创建表时指定的值。该值可以是 0 - 255 之间的任意一个值。当 char 类型的值存储时,右边空余部分会被填充,从而达到指定的长度大小。当 char 类型的值被检索时,尾随的空格将会被移除,除非开启 PAD_CHAR_TO_FULL_LENGTH 的SQL模式

????????Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535. The effective maximum length of a VARCHAR is subject to the maximum row size (65,535 bytes, which is shared among all columns) and the character set used. See Section 8.4.7, “Limits on Table Column Count and Row Size”.

????????varchar 列是可变长度的字符串,其长度可以指定为 0 - 65535,该值取决于最大行大小(65535byte,所有列共享)以及所使用的字符集

????????In contrast to CHAR, VARCHAR values are stored as a 1-byte or 2-byte length prefix plus data. The length prefix indicates the number of bytes in the value. A column uses one length byte if values require no more than 255 bytes, two length bytes if values may require more than 255 bytes.

????????对比char来说,varchar值存储时会加上 1-byte 或者 2-byte 的长度前缀。该前缀标明了 值的长度。如果value所需长度没有超过就使用 1byte,否则使用 2byte

????????If strict SQL mode is not enabled and you assign a value to a CHAR or VARCHAR column that exceeds the column's maximum length, the value is truncated to fit and a warning is generated. For truncation of nonspace characters, you can cause an error to occur (rather than a warning) and suppress insertion of the value by using strict SQL mode. See Section 5.1.11, “Server SQL Modes”.

????????在严格模式没有开启的情况下,对 char 和 varchar 列的 超出列长度最大值的赋值,value 会被截去一部分在存储,并且会产生一个 warning。如果你想要阻止对截取非空格文字的(产生错误),可以通过开启严格模式实现

????????For VARCHAR columns, trailing spaces in excess of the column length are truncated prior to insertion and a warning is generated, regardless of the SQL mode in use. For CHAR columns, truncation of excess trailing spaces from inserted values is performed silently regardless of the SQL mode.

????????对于 varchar 的列,不论是什么SQL模式,尾随的空格的长度的超出部分会在插入之前被截断,并且产生一个 warning(做实验没这效果)。对于 char 而言,不管什么模式,会悄悄的移除尾随的空格。

??VARCHAR values are not padded when they are stored. Trailing spaces are retained when values are stored and retrieved, in conformance with standard SQL.

????????varchar 值在存储时,不会进行填充范围空间。在标准SQL时,将值存储和检索时,将会保留尾随的空格。

示例

????????InnoDB encodes fixed-length fields greater than or equal to 768 bytes in length as variable-length fields, which can be stored off-page. For example, a CHAR(255) column can exceed 768 bytes if the maximum byte length of the character set is greater than 3, as it is with utf8mb4

????????innoDB 编码固定长度的字段 大于 或者 等于 768 字节长度作为可变长度字段,可以存储在 off-page 中。例如:一个 char(255)列,如果字符集的单个字符的字节长度 超过 3 的话(于 utf8mb4 一样),可以存储超出 768 字节的字符。

总结一下

MySQL默认是严格模式的,非严格模式就不做讨论了。

  1. 长度方面
    1. char长度固定,多余的部分使用 空格填充
    2. varchar 长度可变,根据实际值的大小分配存储空间
    3. char的最大长度为 255,当然实际存储要考虑字符集
    4. varchar的最大长度是行的最大长度 65535,当然实际存储要考虑字符集
  2. 存储方面
    1. char会自动将字符后面的 空格字符省略,相当于做了一次 trim() 操作
    2. varchar 并不会去掉尾随的空格,如果尾随空格超出 值允许的范围,则截断超出部分
    3. 不论是 varchar 还是 char只要超出部分非空格字符,则会报错,并且插入失败
    4. varchar 存储时 会有一个 长度前缀

实际存储

优劣:

考虑选型的时候无非从两个维度考虑,空间+时间

空间上:varchar 根据实际长度分配存储空间,char 则是固定长度,所以相对而言 varchar 要更省空间,也能够提供后续的兼容性。但是选择上要根据实际情况来,如果字格字段就固定了是这么长,不可能变,其实选择char即可。

时间上:由于varchar要去解析长度,多一步操作。除此之外,如果该列经常发生改变,并且字符长度还要改变的情况下,使用 varchar 就可能出现 行迁移的情况了。所以在速度上 varchar 要稍微慢一些 !

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-25 23:15:32  更:2022-09-25 23:17:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年3日历 -2024/3/29 18:49:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码