由于Varchar字段的存储要求基于输入的字符串的实际长度,因此将每个Varchar字段指定为最大可能值的缺点是什么:Varchar(65535)? 好吧,除了1个额外的字节以外,最大字段数> 255个字符?

[长度为L的字符串的存储要求:如果列值需要0 – 255字节,则L + 1字节;如果值可能需要255个以上字节,则L + 2字节]

谢谢!

如果不是相同的问题,请联系:stackoverflow.com/questions/262238/

感谢大家的意见! 我是stackoverflow的新手,并真诚地感谢每个人的响应能力。 :-)

从文档-表的列数和行大小限制:

Every table (regardless of storage engine) has a maximum row size of 65,535 bytes. Storage engines may place additional constraints on this limit, reducing the effective maximum row size.

The maximum row size constrains the number (and possibly size) of columns because the total length of all columns cannot exceed this size. For example, utf8 characters require up to three bytes per character, so for a CHAR(255) CHARACTER SET utf8 column, the server must allocate 255 × 3 = 765 bytes per value. Consequently, a table cannot contain more than 65,535 / 765 = 85 such columns.

Storage for variable-length columns includes length bytes, which are assessed against the row size. For example, a VARCHAR(255) CHARACTER SET utf8 column takes two bytes to store the length of the value, so each value can take up to 767 bytes.

因此,定义单个VARCHAR(65535)列可以有效地将您限制为该行中的单个列(假设您已将其填满)。

所有这些,除了对于某些类型的数据来说都是如此大的事实是完全错误的-如果您的电话号码列可能包含本地和国际号码,则可以选择使用VARCHAR字段来执行此操作,但是将其设置为20以上可能毫无意义(我很慷慨)。

请参见Bill Karwin的答案,该答案还指出如果使用不必要的长VARCHAR字段生成临时表可能会导致性能下降(与将此类字段转换为CHAR并再次转换-有关详细信息,请参见该帖子)。

但是,除了VARCHAR(65535)列(称为data1)之外,我的表确实还有其他列。 所有这些列都使用输入的数据进行填充,因为没有data1列实际上包含接近最大大小的字符串。

@tgoneil-尝试在该列中插入65535个字符,并在其他列中插入数据。

我同意您的警告(假设您已填写),并理解这一点。 就我而言,可能永远不会在该字段中插入大小为65535的实际字符串,因此从一开始就绝不是问题。 似乎限制VARCHAR大小的唯一真实原因是,如果尝试超过预期的最大大小,则强制执行错误。

@tgoneil-这本身就是一个很好的理由。

请注意,TEXT和BLOB类型的列不计入此MySQL行大小限制(我以前曾以为VARCHAR也是如此,但我错了)

我认为VARCHAR列长度不仅与存储有关。它们也与数据语义有关。

即将name列指定为varchar(100)表示存储在系统中的名称不得超过100个字符。

在存储方面,它们应该是相同的。虽然,行大小估计在VARCHAR列上具有特定长度的情况下会更准确,而在没有行长度估计的情况下(不需要统计收集系统将数据分布保持在VARCHAR大小上)。

一种可能的原因是改善与其他应用程序的兼容性。例如,如果您有一个使用" product_no"字段长度为100个字符的应用程序,而您想与一个使用类似" model_no"字段类似长度为40个字符的应用程序进行交互,那将很痛苦。应用程序中任何超过40个字符的product_nos都将被截断,您必须找出某种方法在应用程序之间进行转换。

例如,MySQL中的MEMORY引擎不能很好地支持VARCHAR-Fields。引擎将为每一行保留最大字节数,而不是实际使用的长度。因此,如果您定义一个具有单个VARCHAR(1000)列的表,则添加的每一行的内存使用量将为1000 * 3字节,即使它们是空字符串也是如此。

原因之一是该字段的大小是对输入数据的检查。您是否真的要有人输入1000个字符的电话号码?字段太大是确保垃圾将输入到数据库中的一种方法。您的电话号码上会显示类似的内容(例如,不是随机产生的):

"只和前台的大金发女郎说话"

而不是真实的电话号码或电子邮件字段,其中包含有关客户的注释,因为他们没有注释字段?当您尝试向其发送电子邮件时,效果并不理想。

宽表可能会在数据库中产生所有问题,因为您可能会遇到意外的记录限制(您可以将表设计为比实际存储在一个记录中更宽的表,有时这会导致插入意外失败)和作为数据的性能问题跨数据页分隔。我知道您可以从SQL Server的宽表中获得该信息,如果mysql遇到类似问题,我也不会感到惊讶。 mysql专家将不得不真正解决这个问题。索引也可能是广泛领域的问题。数据库引擎可能不太倾向于认为索引是有用的。同样,我不确定mysql是否会出现此问题,但这值得研究。我知道这些是在SQL Server中使用所有字段的最大字段大小的问题,mysql可能有这些问题或其他SQL Server没有的问题。

mysql为什么没有nvarchar,关于mysql:为什么不将每个VARCHAR指定为VARCHAR(65535)?相关推荐

  1. nvarchar在mysql中是_如何在MySQL中创建NVARCHAR列?

    MySQL转换NVARCHAR()为VARCHAR().NVARCHAR在MySQL中代表National Varchar.让我们首先创建一个表,其中" StudentName"列 ...

  2. MySQL中的char和varcharmysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别

    1.varchar能存多少汉字.数字? 具体还是要看版本的,一个字符占用3个字节 ,一个汉字(包括数字)占用3个字节=一个字符 4.0版本以下,varchar(100),指的是100字节,如果存放UT ...

  3. mysql关于时间的面试题,mysql时间设置默认值MySQL常见面试题

    1.limit(选出10 到20 条) select * from students order by id limit 9,10; 2.MySQL 会使用索引的操作符号 =,>,=,betwe ...

  4. liunx上mysql源码安装mysql,搞定linux上MySQL编程(一):linux上源码安装MySQL

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 1. 首先下载源码包: ftp://ftp.jaist.ac.jp/pub/m ...

  5. .net连接mysql数据_.net连接MYSQL数据库的方法及示例!

    连接MYSQL数据库的方法及示例 方法一: 使用MYSQL推出的MySQL Connector/Net is an ADO.NET driver for MySQL 该组件为MYSQL为ADO.NET ...

  6. 加速mysql导入时间_加快mysql导入导出速度

    MySQL导出的SQL语句在处理百万级数据的时候,可能导入要花几小时.在导出时合理使用几个参数,可以大大加快导入的速度. -e 使用包括几个VALUES列表的多行INSERT语法; --max_all ...

  7. mysql error number 1130,[转]mysql error number 1130的解决方法

    关键字: is not allowed to connect to this MySQL server 如果你想连接你的mysql的时候发生这个错误: ERROR 1130: Host '192.16 ...

  8. Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2)

    安装了mysql, 使用命令mysql -u root -p 弹出Can 't connect to local MySQL server through socket '/tmp/mysql.soc ...

  9. linux mysql 无法识别,Linux下MySQL 5.7.23无法远程连接解决方案

    MySQL 版本:5.7.23操作系统:Linux问题描述:只能通过Linux系统账号Root命令行进入数据库,无法使用JDBC,远程连接工具进入数据库.报错:ERROR 1698 (28000): ...

最新文章

  1. [JLOI2013]地形生成
  2. AFDetV2:重新思考点云检测方法中第二阶段检测器的必要性(CVPR2021)
  3. matlab 通过矩阵变换使图像旋转平移_数字图像处理|P11 第三章 第四节 图像的几何变换...
  4. 二值信号量解决任务间资源共享问题
  5. 把伪需求扼制在摇篮里-B端产品需求方法论
  6. linux window nginx性能,Nginx负载均衡搭建(Window与Linux)
  7. laravel 错误与日志
  8. 多核CPU上python多线程并行的一个假象(转)
  9. 第4章 MySQL数据库结构优化
  10. 如何做到在职场中清楚有效的沟通,成为一个靠谱的职场人?
  11. 【Linux】 CentOS 7 安装 RabbitMQ
  12. 我优化多年的 C 语言竟然被 80 行 Haskell 打败了?
  13. 强制更新LYNC客户端的地址簿
  14. forEach(BiConsumer action)方法遍历Map集合
  15. 李江涛:使用Sakai构建开放式教学平台
  16. isbn书号查询php代码,php根据isbn书号查询amazon网站上的图书信息的示例_PHP
  17. RNN(pytorch)的维度问题——用GRU实现文本分类(参考刘二大人)
  18. 微信分享开发:准备工作[微信公众平台以及微信中控服务配置](一)
  19. 手机服务器 微信QQ,玩家天价买服务器语聊开黑 小白没想明白:微信QQ难道不行?...
  20. 谷歌施密特:中国人相当出色2025年将超美国成AI主导丨业界大佬财报频出【软件网每日新闻播报│第11-3期】

热门文章

  1. 磨刀——python及相关工具
  2. JavaScript里的循环方法:forEach,for-in,for-of
  3. UITableView优化
  4. Magento 头部的演示信息去除
  5. 小菜鸟学 Spring-Dependency injection(二)
  6. 如何安装和使用RAutomation
  7. 判斷字符串中是否含有中文字符
  8. laravel CURD facade原始SQL
  9. Vue静态资源的获取
  10. Windows7_x64下编译64位ffmpeg