当我们在 MySQL 中创建具有 VARCHAR 列的表时,我们必须为其设置长度。但是对于 TEXT 类型,我们不必提供长度。
VARCHAR和TEXT有什么区别?
最佳答案
文本
c 字节的磁盘空间,其中 c 是存储字符串的长度。VARCHAR(M)
M 个字符的可变最大大小M 需要在 1 到 65535 之间c 个字节(对于 M ≤ 255)或 2 + c(对于 256 ≤ M ≤ 65535) 字节的磁盘空间,其中 c 是存储字符串的长度TEXT 的固定最大大小为 2¹⁶-1 = 65535 个字符。
VARCHAR 有一个变量 最大大小M 高达 M = 2¹⁶-1。
所以你不能选择 TEXT 的大小,但你可以选择 VARCHAR。
另一个区别是,您不能在 TEXT 列上放置索引(全文索引除外)。
所以如果你想在列上有一个索引,你必须使用VARCHAR。但请注意,索引的长度也是有限的,因此如果您的 VARCHAR 列太长,您只能使用索引中 VARCHAR 列的前几个字符(参见 CREATE INDEX 的文档)。
但你也想使用 VARCHAR,如果你知道可能的输入字符串的最大长度只有 M,例如电话号码或姓名或类似的东西。然后你可以使用 VARCHAR(30) 而不是 TINYTEXT 或 TEXT 如果有人试图保存所有三个“指环王”的文本"在您的电话号码列中的书籍您只存储前 30 个字符 :)
编辑:如果要存入数据库的文本长度超过65535个字符,则必须选择MEDIUMTEXT或LONGTEXT,但要小心:MEDIUMTEXT 最多可存储 16 MB 的字符串,LONGTEXT 最多可存储 4 GB。如果您使用 LONGTEXT 并通过 PHP 获取数据(至少如果您使用 mysqli 而没有 store_result),您可能会遇到内存分配错误,因为 PHP 尝试分配 4 GB 内存以确保可以缓冲整个字符串。这可能也发生在 PHP 以外的其他语言中。
但是,您应该始终检查输入(是否太长?是否包含奇怪的代码?)在将其存储到数据库之前。
注意:对于这两种类型,所需的磁盘空间仅取决于存储字符串的长度,而不取决于最大长度。
例如如果您使用字符集 latin1 并将文本“Test”存储在 VARCHAR(30)、VARCHAR(100) 和 TINYTEXT ,它总是需要5个字节(1个字节存储字符串的长度,每个字符1个字节)。如果将相同的文本存储在 VARCHAR(2000) 或 TEXT 列中,它也需要相同的空间,但在这种情况下,它将是 6 个字节(2个字节存储字符串长度,每个字符1个字节)。
欲了解更多信息,请查看 documentation .
最后,我想补充一点,TEXT 和 VARCHAR 都是可变长度数据类型,因此它们很可能会最小化您需要存储的空间数据。但这伴随着性能的权衡。如果你需要更好的性能,你必须使用像 CHAR 这样的固定长度类型。你可以阅读更多关于这个 here .
关于mysql - MySQL中VARCHAR和TEXT的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25300821/
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev
打印1:defsum(i)i=i+[2]end$x=[1]sum($x)print$x打印12:defsum(i)i.push(2)end$x=[1]sum($x)print$x后者是修改全局变量$x。为什么它在第二个例子中被修改而不是在第一个例子中?类Array的任何方法(不仅是push)都会发生这种情况吗? 最佳答案 变量范围在这里无关紧要。在第一段代码中,您仅使用赋值运算符=为变量i赋值,而在第二段代码中,您正在修改$x(也称为i)使用破坏性方法push。赋值从不修改任何对象。它只是提供一个名称来引用一个对象。方法要么是破坏性
Ruby中的Fixnum方法.next和.succ有什么区别?看起来它的工作原理是一样的:1.next=>21.succ=>2如果有什么不同,为什么有两种方法做同样的事情? 最佳答案 它们是等价的。Fixnum#succ只是Fixnum#next的同义词。他们甚至在thereferencemanual中共享同一block. 关于ruby-Ruby中.next和.succ的区别,我们在StackOverflow上找到一个类似的问题: https://stacko
我明白了defa(&block)block.call(self)end和defa()yieldselfend导致相同的结果,如果我假设有这样一个blocka{}。我的问题是-因为我偶然发现了一些这样的代码,它是否有任何区别或者是否有任何优势(如果我不使用变量/引用block):defa(&block)yieldselfend这是一个我不理解&block用法的具体案例:defrule(code,name,&block)@rules=[]if@rules.nil?@rules 最佳答案 我能想到的唯一优点就是自省(introspecti
-if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc