欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

MySQL — VARCHAR 长度截断问题,c语言截断问题

墨初 知识笔记 55阅读
目录

文章目录 目录VARCHAR(255) 能够存储多少个汉字查看 MySQL 版本VARCHAR 的长度截断问题MySQL 模式类型

VARCHAR(255) 能够存储多少个汉字 MySQL 4.1 版本以前 VARCHAR 以 Byte 为单位存储所以在 UTF8 每个汉字 3Bytes 的前提下VARCHAR(255) 最多可存放约 85 个汉字MySQL > 4.1 版本VARCHAR 以 “CHAR” 为单位存储所以不需要关心每个汉字存多少个 BytesVARCHAR(255) 可存放 255 个汉字

参考 查看 MySQL 版本

MySQL> select version();
VARCHAR 的长度截断问题

因为在 MySQL > 4.1 版本中VARCHAR(255) 指定了一个最大长度为 255 个 CHAR不是字节数的列。

默认情况下宽松模式下如果将一个长度超过 255 个字符的字符串插入到这个列中MySQL 会截断这个字符串只保存前 255 个字符并触发 WARNING但不会引发错误。这意味着如果你尝试插入一个长度为 260 个字符的字符串到一个 VARCHAR(255) 列中MySQL 将保留该字符串的前 255 个字符并丢弃剩余的字符。

显然这会带来巨大的麻烦。因为数据被截断之后 ORM 就再无法使用常规的编解码格式e.g. UTF8进行正常处理。

所以如果你希望在插入过长的字符串时引发错误就可以启用 MySQL 的 “严格模式”。此时MySQL 会拒绝插入长度超过列指定长度的字符串并抛出一个错误e.g. Data too long for column。

MySQL> SET GLOBAL sql_modeSTRICT_ALL_TABLES;

或者你应该在代码逻辑中添加长度校验逻辑。参考 MySQL 模式类型 ANSI 模式宽松模式对插入数据进行校验如果不符合定义类型或长度对数据类型调整或截断保存报 warning 警告。TRADITIONAL 模式严格模式当向 MySQL 数据库插入数据时进行数据的严格校验保证错误数据不能插入报 error 错误。用于事务时会进行事务的回滚。STRICT_TRANS_TABLES 模式严格模式进行数据的严格校验错误数据不能插入报 error 错误。只对支持事务的表有效。STRICT_ALL_TABLES 模式严格模式进行数据的严格校验错误数据不能插入报 error 错误。对所有表都有效。

标签:
声明:无特别说明,转载请标明本文来源!