mysql char(36)_MySQL中char(36)被认为是GUID导致的BUG及解决方案

转载地址:http://www.cnblogs.com/end/archive/2012/12/26/2834068.html

(近日正好有一个项目需要用到C#来操作MySQL数据库,遇到这个奇怪的问题)

有时候在使用Toad或在程序中,偶尔会遇到如下的错误:

System.FormatException

GUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。

Stack Trace:

在 System.Guid..ctor(String g)

在 MySql.Data.Types.MySqlGuid.MySql.Data.Types.IMySqlValue.ReadValue(MySqlPacket packet, Int64 length, Boolean nullVal)

在 MySql.Data.MySqlClient.NativeDriver.ReadColumnValue(Int32 index, MySqlField field, IMySqlValue valObject)

在 MySql.Data.MySqlClient.ResultSet.ReadColumnData(Boolean outputParms)

在 MySql.Data.MySqlClient.ResultSet.NextRow(CommandBehavior behavior)

在 MySql.Data.MySqlClient.MySqlDataReader.Read()

在 Quest.Toad.Db.ToadDataAdapter.InternalReadBackground()

原因是如果一个字段定义为 CHAR(36), 则MySQL官方的连接器会将其当成 GUID 类型,有些情况下会要求你输入(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)形式的字符串,否则会报错。实际上,有时候 某个字段碰巧设为可CHAR(36), 但是我们的本意并非当它是GUID。

(例如使用 MySqlDataAdapter 的 Fill 方法填充 DataTable时,就会抛出 Exception。可以使用连接器安装后所附带的 TableEditor 进行观察,重复出这个Bug)

今天特意追踪了一个MySql.Data中的代码:发现MySqlCommand在Prepare的时候会调用Driver的PrepareStatement方法,会初始化ResultSet,会调用MySqlField.SetTypeAndFlags,其中有代码如下:

if (((this.Type == MySqlDbType.String) && (this.CharacterLength == 0x24)) && !this.driver.Settings.OldGuids)

{this.mySqlDbType =MySqlDbType.Guid;

}

原因查明,解决方法是:将这个字段修改为 VARCHAR(36) 或者 CHAR(40),总之,不是 CHAR(36) 就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值