1

我在我的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 这样做,我怎样才能保存文本?

4

2 回答 2

2

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

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

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

于 2012-10-01T12:02:38.467 回答
1

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

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

于 2012-10-01T11:58:37.367 回答