【问题标题】:MySQL varchar (255) limitation & AnomalyMySQL varchar (255) 限制和异常
【发布时间】:2012-10-01 11:54:37
【问题描述】:

我在我的mysql数据库中定义了一个列:

ALTER TABLE `my_table` CHANGE `desc` `desc` VARCHAR( 255 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL

但是当我从前端输入要插入到表格中的文本时,在列数据的大小达到 233 后,它截断进一步添加的文本,即不保存超过 233 个字符的文本!!

我尝试将列的大小更改为 VARCHAR(511),但没有成功。

我使用 php strlen() 计算了字符数,结果显示为 233 个字符

为什么 MySQL 会这样做,我如何保存文本?

【问题讨论】:

  • 运行DESCRIBE my_table。它对 desc 列有什么看法?
  • 会不会是字符集问题?尝试在字符串中添加一些 (latin1) 字符,看看是否仍然缺少 2 个字符。
  • @GlaciesofPacis DESCRIBE my_table 揭示 desc 是 varchar(255) 而不是 NULL 等..
  • @Clarence 我的字符串中有“逗号”
  • 所以.. 澄清一下,您保存的字符串实际上长度为 255 个或更多字符,并且您没有计算逗号?

标签: php mysql varchar


【解决方案1】:

A VARCHAR(250) NOT NULL 用一个字节存储长度 n,用 n 个字节存储实际字符串。因此,包含值“abc”的列将占 4 个字节。在VARCHAR(250) NULL 中,nullity 占用一位,NULL 值不会占用其他任何内容。非空值占用该位,长度为一个字节,数据为 n 个字节。这里需要一点意味着几个可为空的列共享一个或多个字节来记录它们的空性。

其他可变长度数据类型类似。各种大小的 BLOB 和 TEXT 类型的长度可能不止一个字节,但在其他方面的工作方式几乎相同。数字类型以及固定长度的 CHAR 类型具有固定的内存要求。我想我 CHAR 会省略长度字节,因为它的内容用空格填充到该固定长度。

索引可能会增加内存需求。多字节字符集(包括UTF-8)可能会增加内存需求,因此上述语句仅在您的表是为 latin1 或类似文件创建时才成立。所以你可以推断出VARCHAR(250) 并不意味着 255 个字符,这取决于你如何编码你的字符串

【讨论】:

  • 请说清楚一些好吗?
  • 嗯,这意味着 latin1 中的 abc = varchar(3),但是 abc 是另一种编码类型,它可能是 abc = varchar(5);
  • iam 使用 latin1_sweedish_ci @Weacked
【解决方案2】:

使用mb_strlen() 函数计算字符数,它是多字节安全的,您的字符串中似乎有一些特殊字符,请参阅here

这取决于 MySQL 服务器的版本和设置,但如果某些字符串在插入或更新期间超过了预定义的长度 - 那么 MySQL 将自动截断超出的部分。

【讨论】:

  • mb_strlen() 给出 233 ,没有差异
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2010-11-18
  • 2023-03-08
  • 2017-10-12
  • 1970-01-01
  • 2011-02-11
相关资源
最近更新 更多