【MySQL】Char与VarChar详解

这篇具有很好参考价值的文章主要介绍了【MySQL】Char与VarChar详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

长度申明

存储结构

超长处理

变长字段

排序规则


CHAR和VARCHAR类型相似,但它们在存储和检索方式上有所不同。它们在最大长度和是否保留尾随空格方面也存在差异。

长度申明

CHAR和VARCHAR类型的声明包含一个长度,该长度表示您希望存储的最大字符数。例如,CHAR(30)可以容纳最多30个字符。

CHAR列的长度在创建表时被固定为您声明的长度。长度可以是从0到255的任何值。当存储CHAR值时,它们将右侧用空格填充到指定的长度。当检索CHAR值时,除非启用了PAD_CHAR_TO_FULL_LENGTH SQL模式,否则将删除尾随空格。

VARCHAR列中的值是可变长度字符串。长度可以指定为0到65,535的值。VARCHAR的有效最大长度取决于最大行大小(65,535字节,这在所有列之间共享)和使用的字符集。

存储结构

与CHAR不同,VARCHAR值存储为1字节或2字节的长度前缀加上数据。长度前缀指示值中的字节数。如果值需要的字节数不超过255字节,则列使用一个长度字节,如果值可能需要超过255字节,则使用两个长度字节。

超长处理

如果未启用严格的SQL模式,并且您为CHAR或VARCHAR列分配的值超过了列的最大长度,则该值将被截断以适应,并生成一个警告。对于非空格字符的截断,您可以通过使用严格的SQL模式来引发错误(而不是警告),并阻止插入该值。

对于VARCHAR列,超过列长度的尾随空格在插入之前被截断,并生成一个警告,不管使用的SQL模式是什么。对于CHAR列,无论使用的SQL模式是什么,都会在插入的值中静默执行超出尾随空格的截断。

VARCHAR值在存储时不进行填充。尾随空格在存储和检索值时保留,符合标准SQL的规范。

以下表格通过展示将各种字符串值存储到CHAR(4)和VARCHAR(4)列中的结果(假设列使用单字节字符集,如latin1),阐明了CHAR和VARCHAR之间的差异。

数据值 CHAR(4) 存储大小 VARCHAR(4) 存储大小
'' '    ' 4 bytes '' 1 byte
'ab' 'ab  ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

在表的最后一行显示的存储值仅在未使用严格SQL模式时适用;如果启用了严格模式,超出列长度的值将不会被存储,并且会产生错误。

变长字段

InnoDB将长度大于或等于768字节的固定长度字段编码为可变长度字段,这些字段可以存储在页外。例如,如果字符集的最大字节长度大于3,那么CHAR(255)列的长度可以超过768字节,这在utf8mb4字符集中是成立的。

如果将给定的值存储到CHAR(4)和VARCHAR(4)列中,从列中检索的值并不总是相同,因为在检索CHAR列时会删除尾随空格。以下示例说明了这种差异:

mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO vc VALUES ('ab  ', 'ab  ');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
+---------------------+---------------------+
| CONCAT('(', v, ')') | CONCAT('(', c, ')') |
+---------------------+---------------------+
| (ab  )              | (ab)                |
+---------------------+---------------------+
1 row in set (0.06 sec)

排序规则

CHAR、VARCHAR和TEXT列中的值根据分配给列的字符集排序和比较。

MySQL的排序规则具有PAD SPACE的填充属性,除了基于UCA 9.0.0及更高版本的Unicode排序规则,它们具有NO PAD的填充属性。

要确定排序规则的填充属性,可以使用**INFORMATION_SCHEMA COLLATIONS**表,该表具有PAD_ATTRIBUTE列。

对于非二进制字符串(CHAR、VARCHAR和TEXT值),字符串排序规则的填充属性确定了在字符串末尾的尾随空格在比较中的处理方式NO PAD排序规则将尾随空格视为比较中的重要部分,就像任何其他字符一样。PAD SPACE排序规则将尾随空格视为比较中的无关紧要部分;字符串在比较时不考虑尾随空格。请参见比较中的尾随空格处理。服务器SQL模式对于尾随空格的比较行为没有影响。

对于那些删除尾随填充字符或在比较中忽略它们的情况,如果列具有需要唯一值的索引,则插入到该列的仅在尾随填充字符数量上不同的值会导致重复键错误。例如,如果表包含'a',尝试存储'a '将导致重复键错误。文章来源地址https://www.toymoban.com/news/detail-819863.html

到了这里,关于【MySQL】Char与VarChar详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 后端服务器中实现MySQL数据库操作接口

    首先,在Node.js中连接MySQL数据库需要用到mysql模块。可以使用npm包管理器进行安装: 安装完成之后,在Node.js中引入mysql模块: 接着,可以使用mysql.createConnection()方法创建数据库连接。这个方法需要传入一些连接参数,比如主机名、用户名、密码、数据库名称等: 其中,host表

    2024年04月11日
    浏览(48)
  • Django后端开发——mysql数据库连接遇到的问题及解决

    stackflow帖子:https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost 报错: 数据库拒绝root用户的连接 settings.py中关于数据库的配置: 可以看到root用户的密码为123456 但是在mysql数据库里面查看用户信息,root的密码为空 这样的不匹配导致连接失败 之前尝试

    2024年02月20日
    浏览(74)
  • 解决Data too long for column ‘xxx‘ at row 1问题以及深入理解mysql的字符串数据类型(char,varchar,enum,text,longtext...)

    今天在测试环境新增数据时,报出如是错误: Data too long for column \\\'apply_service_type\\\' at row 1 。 为了复现这个问题,我特地在本地数据库中增加如下 test 表:

    2023年04月17日
    浏览(49)
  • MySQL数据库详解

    MySQL是一个广泛使用的开源关系数据库管理系统(RDBMS)。它使用了结构化查询语言(SQL)来管理存储在其系统中的数据。SQL是一种用于插入、更新、删除和检索数据库中数据的标准语言。 MySQL的主要特性包括: 性能优化:MySQL具有优秀的性能、可靠性和可扩展性,可以处理大

    2024年02月16日
    浏览(41)
  • web开发中,简单的案例说明前端页面和后端以及mysql数据库的交互过程

            首先这是一个基于 web开发 的稿子,作者也是转java20天左右,以前也一直迷惑起那段页面是如何和后端进行交互,数据提交提交到了哪里?后端开发如何获取到前端提交的数据呢?后端数据提交到数据库中应该如何处理,接下来通过一个简单的例子,登录案例 (实

    2024年02月03日
    浏览(57)
  • Node.js程序如何访问MySQL数据库呢?Sequelize操作MySQL数据库详解

    当我们安装好MySQL后,Node.js程序如何访问MySQL数据库呢? 访问MySQL数据库只有一种方法,就是通过网络发送SQL命令,然后,MySQL服务器执行后返回结果。 我们可以在命令行窗口输入mysql -u root -p,然后输入root口令后,就连接到了MySQL服务器。因为没有指定–host参数,所以我们连

    2023年04月08日
    浏览(46)
  • MySQL数据库之事物(详解)

    目录 一.事物的概念 二.为什么需要事物 三.事物的执行机制 四.MySQL的事物基本使用 五.事物的ACID特性 5.1一致性 六 事物的隔离级别 6.1事物隔离的原因及解决思路 6.2MySQL事物的隔离级别 🎁个人主页:tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主 🎥 本文由 tq02 原创,首发

    2024年02月16日
    浏览(49)
  • 【数据库】 mysql用户授权详解

    目录 MySQL用户授权 一,密码策略 1,查看临时密码 2,查看数据库当前密码策略: 二, 用户授权和撤销授权 1、创建用户 2,删除用户 3,授权和回收权限 mysql刚安装时,临时密码会存储在 /var/log/mysqld.log 1,查看临时密码 方法一:直接给出密码   方法二:查到的语句的最后为

    2024年02月11日
    浏览(62)
  • MySQL数据库——MySQL字符集和校对规则详解

    在讲解字符集和校对规则之前,我们先来简单了解一下字符、字符集和字符编码。 字符(Character) 是计算机中字母、数字、符号的统称,一个字符可以是一个中文汉字、一个英文字母、一个阿拉伯数字、一个标点符号等。 计算机是以二进制的形式来存储数据的。平时我们在

    2024年02月05日
    浏览(44)
  • MySQL数据库——MySQL配置文件(my.ini)详解

    my.ini 是 MySQL 数据库中使用的配置文件,MySQL 服务器启动时会读取这个配置文件,我们可以通过修改这个文件,达到更新配置的目的。 这里以 Windows 系统下的 my.ini 配置文件为样板,讲解 MySQL 配置文件中的参数。 一般情况下,my.ini 在 MySql 安装的根目录下,也有可能在隐藏文

    2023年04月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包