我在我的mysql数据库中定义了一个列:
ALTER TABLE `my_table` CHANGE `desc` `desc` VARCHAR( 255 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL
但是当我从前端输入一个文本插入表格后,在列数据大小达到233后,截断了进一步添加的文字,即不保存超过233个字符的文字!! < / p>
我尝试将列的大小更改为VARCHAR(511),但没有成功。
我使用php strlen()
计算了nos个字符,并显示了233个字符
为什么MySQL会这样做,我该如何保存文本?
答案 0 :(得分:2)
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个字符,这取决于您对字符串进行编码的方式
答案 1 :(得分:1)
使用mb_strlen()
功能计算字符数,它是多字节安全的,您的字符串中显示一些特殊字符,请参阅here。
这取决于MySQL服务器的版本和设置,但如果某些字符串在插入或更新期间超过了预定义的长度 - 那么MySQL将自动截断它的超出部分。