如何在mysql 5.1中约束varchar?

时间:2014-06-22 10:13:58

标签: mysql

我需要在mysql 5.1中创建可以存储用户反馈的列。 它不应该太长,所以我认为UTF-8不会超过1000个字符。

问题是如何在mysql 5.1中有效地表示这一点。

现在我有:

`description` varchar NOT NULL,

但是如何约束varchar最多可容纳1000个UTF-8字符?

3 个答案:

答案 0 :(得分:2)

来自the documentation

  

VARCHAR列中的值是可变长度字符串。长度可以指定为MySQL 5.0.3之前的0到255之间的值,5.0.3及更高版本中的0到65,535之间的值。 MySQL 5.0.3及更高版本中VARCHAR的有效最大长度受最大行大小(65,535字节,在所有列之间共享)和使用的字符集的限制。

这意味着您可以在VARCHAR列中存储多达65,535个字节。但是,来自String Type Overview

  

MySQL以字符为单位解释字符列定义中的长度规范。 (在MySQL 4.1之前,列长度以字节为单位进行解释。)这适用于CHAR,VARCHAR和TEXT类型。

因此,使用UTF8排序规则声明您的表,并将varchar的长度设置为1,000 个字符,MySQL将在幕后为您完成工作。

答案 1 :(得分:2)

由于大小明显以字节为单位定义,... -correction-字段大小以'字符单位定义。它有点不清楚它们的意思,但我猜它们的意思是' code units'。

删除了其余的详细解释,因为它不是(完全正确)。

校正。在MySQL中,您实际上定义了字段中的字符数。它仍然限于65535 字节边界。在此之上,MySQL只为UTF-8保留每个字符3个字节,这意味着您不能拥有超过21844个字符的UTF-8字段,并且声明字段als VARCHAR(21900)将因此失败:{{1 }}。顺便说一句,此消息中的数字是错误的。实际的最大大小是21844. 21845是65535的1/3,但我想你还需要减去字段大小标题的两个字节。

但是3个字节的限制很奇怪。 unicode定义旨在能够使用额外字符进行扩展。已经有4个字节的补充字符,实际上无法存储在的UTF-8 varchar(1)字段中,或者任何varchar字段,因为MySQL似乎无法存储阅读这些字符:" Column length too big for column 'field1' (max = 21845); use BLOB or TEXT instead: "。所以我猜你需要一个实际的二进制/ blob列才能存储这些字符。

我认为关于这个主题的文档很差,但我已经尝试了一些事情并得出了这个结论。你可以在这里看到小提琴:http://sqlfiddle.com/#!2/4d938

问题:

因此,根据您的具体情况,将字段声明为"Incorrect string value: '\xF0\xA0\x9C\x8E' for column 'field1' at row 1"将会起作用,假设您不希望人们在其反馈中使用补充字符。

有些事情需要考虑:

  • 我认为反馈' 1000个字符的字段非常小。对于很多人来说这已经足够了,但是如果你不得不说更多,那么如果你不能这么做就很烦人。所以我会让这个领域更大。
  • varchar字段存储在记录中,并占用最大行大小65536字节的一部分。这是一个重要的事实。一行中不能有两个varchar(20000)字段,因为它们一起大于这个最大行大小 对于大型文本字段来说,更好的选择是使它们成为TEXT或MEDIUMTEXT,它们可以更大,并以不同的方式存储。

答案 2 :(得分:0)

  

VARCHAR列中的值是可变长度字符串。长度可以指定为MySQL 5.0.3之前的0到255之间的值,5.0.3及更高版本中的0到65,535之间的值。

http://dev.mysql.com/doc/refman/5.0/en/char.html