我在MySQL中有一个消息表,用于在用户之间记录消息.除了典型的id和消息类型(所有整数类型),我需要将实际的消息文本保存为VARCHAR或TEXT.我设置的前端限制为3000个字符,这意味着消息永远不会插入到数据库中,因为它比这更长.
是否有理由使用VARCHAR(3000)或TEXT?有一些关于编写VARCHAR(3000)的东西,感觉有点违反直觉.我已经浏览了Stack Overflow上的其他类似帖子,但是能够获得特定于此类公共消息存储的视图.
MySQL中utf8mb4和utf8charsets有什么区别?
我已经知道ASCII,UTF-8,UTF-16和UTF-32编码; 但我很想知道utf8mb4编码组与MySQL服务器中定义的其他编码类型的区别.
是否有任何特殊利益/建议使用utf8mb4而不是utf8?
如果您尝试在表上创建TEXT列,并在MySQL中为其提供默认值,则会出现错误(至少在Windows上).我看不出文本列不应该有默认值的任何原因.MySQL文档没有给出解释.这对我来说似乎不合逻辑(有点令人沮丧,因为我想要一个默认值!).有谁知道为什么不允许这样做?
我有两个字段:一个用于存储excerpt最大为500个字符的字段,另一个用于存储description最大为10,000个字符的字段.
我应该使用哪些数据类型,TEXT或者VARCHAR?为什么?
在MySQL 5.0.3 VARCHAR之后接受~65000个字符.但这并没有说明为什么我应该使用一种类型或另一种类型.
我的推理,我应该使用VARCHAR的摘录,因为我可以指定一个大小的限制,并TEXT为description外地,因为它的大.
mysql> desc temp1;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| value | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
mysql> desc temp2;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| value | text | YES | | NULL | |
+-------+------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)
255-每行中有一个“ a”字符(在两个表中)
mysql> select * from temp1 limit 1;
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| value |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
mysql> select …Run Code Online (Sandbox Code Playgroud) 我通常不使用 MySQL 工作台,我试图通过选择 TEXT() 创建一个带有文本列的表,但是我不确定应该在“()”之间放入什么值。如果我把它留空,它会给我错误:
给定的数据类型 TEXT() 包含错误,不能被接受。而是保留以前的值。
我可以在括号内放一个数字,但我想知道它如何影响列。
我在网上找不到任何答案。我知道它如何影响诸如 DATETIME() 之类的事情,但不知道这种数据类型。
我目前正在开发Windows操作系统,我已经安装了MySQL社区服务器5.6.30,一切都很好.我有一个初始化数据库的脚本,并且一切正常.
现在我正在尝试在Linux环境中运行此脚本 - 相同的MySQL版本 - 我收到以下错误:
第3行的错误1074(42000):列'txt'的列长太大(max = 21845); 请改用BLOB或TEXT
脚本 -
DROP TABLE IF EXISTS text;
CREATE TABLE `texts` (
`id` BINARY(16) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
`txt` VARCHAR(50000) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
显然我的Windows操作系统上有一些我需要在Linux上复制的MySQL服务器配置; 任何人都可以分享想法吗?
更新1
在AWS的RDS上,它也可以工作,我非常确定它只是一个基于Linux的服务,所以显然它只是一个配置问题.
有没有人知道如何用UTF8达到varchar 50k?我不想使用TEXT或MEDIUMTEXT或其他任何东西,只是普通的旧varchar(大小)
更新2
我很欣赏所提出的不同的解决方案,但我不寻找新的解决方案我只是寻找答案,为什么varchar(50k)在Windows下工作,在linux下它没有.顺便说一句,我使用字符集UTF8和collation utf8_general_ci.
回答
回答我自己的问题,它是SQL_MODE的问题,它被设置为STRICT_TRANS_TABLES并且应该被删除.