免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2975 | 回复: 5
打印 上一主题 下一主题

MySQL由 4.0.20升能到 4.1.22,varchar字段长度改变,这是为什么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-04 16:12 |只看该作者 |倒序浏览
前几天把MySQL由 4.0.20升能到 4.1.22

最近发现写入的数据都少了一些字节。

最后查看表结构,发现表结构变了,定义的字段长度就小了。

+--------------+------------+------+-----+----------------+-------+
| Field           | Type       | Null  | Key | Default        | Extra |
+--------------+------------+------+-----+----------------+-------+
| StartNumber  | varchar(7) |      | PRI | 00000000000000 |       |

原来是:
+--------------+------------+------+-----+----------------+-------+
| Field        | Type       | Null | Key | Default        | Extra |
+--------------+------------+------+-----+----------------+-------+
| StartNumber  | varchar(14) |      | PRI | 00000000000000 |       |

这导致只能写进7个字符了。
为什么会这样呢?
我是直接复制数据库文件的。

论坛徽章:
0
2 [报告]
发表于 2010-02-07 13:40 |只看该作者
总长度没有变短的, 拷贝到4.1.22上有字符集的概念, 你这个长度是原来的长度的1/2, 应该默认字符集是gbk
新环境只能插入7个字, 因此英文为7个字节, 中文最多7个汉字, 14个字节.

可以在4.1.22下创建一个正确的表,使用charset latin1,  用frm文件覆盖4.0.16拷过来的那个.
或4.1.22在 default-character-set=latin1下拷过去

这两个版本间myisam数据版本有升级, 最好还是把数据dump出来再导进去

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
3 [报告]
发表于 2010-02-07 19:31 |只看该作者
总长度没有变短的, 拷贝到4.1.22上有字符集的概念, 你这个长度是原来的长度的1/2, 应该默认字符集是gbk
新 ...
phphp 发表于 2010-02-07 13:40


想问下,change log没看到有说字符集概念的新增
http://dev.mysql.com/doc/refman/4.1/en/news-4-1-0.html

ls是凭经验?

论坛徽章:
0
4 [报告]
发表于 2010-02-07 23:43 |只看该作者
想问下,change log没看到有说字符集概念的新增

ls是凭经验?
cenalulu 发表于 2010-02-07 19:31


根据他的表现猜的, create table ...default charset latin1好像是4.1才有的.
http://dev.mysql.com/doc/refman/4.1/en/news-4-1-1.html

论坛徽章:
8
综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-09-14 06:20:00金牛座
日期:2014-10-10 11:23:34CU十二周年纪念徽章
日期:2013-10-24 15:41:34酉鸡
日期:2013-10-19 10:17:1315-16赛季CBA联赛之北京
日期:2017-03-06 15:12:44
5 [报告]
发表于 2010-02-22 10:50 |只看该作者
根据他的表现猜的, create table ...default charset latin1好像是4.1才有的.
phphp 发表于 2010-02-07 23:43



     LZ出来验证一下了

论坛徽章:
0
6 [报告]
发表于 2010-02-22 15:20 |只看该作者
Incompatible change: MySQL interprets length specifications in character column definitions in characters. (Earlier
versions interpret them in bytes.) For example, CHAR(N) means N characters, not N bytes.
For single-byte character sets, this change makes no difference. However, if you upgrade to MySQL 4.1 and configure
the server to use a multi-byte character set, the apparent length of character columns changes. Suppose that a 4.0
table contains a CHAR(8) column used to store ujis characters. Eight bytes can store from two to four ujis characters.
If you upgrade to 4.1 and configure the server to use ujis as its default character set, the server interprets
character column lengths based on the maximum size of a ujis character, which is three bytes. The number of three-byte
characters that fit in eight bytes is two. Consequently, if you use SHOW CREATE TABLE to view the table definition,
MySQL displays CHAR(2). You can retrieve existing data from the table, but you can only store new values containing up
to two characters. To correct this issue, use ALTER TABLE to change the column definition. For example:
ALTER TABLE tbl_name MODIFY col_name CHAR(8);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP