MySQL中char(36)被认为是GUID导致的BUG及解决方案
2016-07-08 15:18
826 查看
转载地址:http://www.cnblogs.com/end/archive/2012/12/26/2834068.html
(近日正好有一个项目需要用到C#来操作MySQL数据库,遇到这个奇怪的问题)
有时候在使用Toad或在程序中,偶尔会遇到如下的错误:
原因是如果一个字段定义为 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,其中有代码如下:
原因查明,解决方法是:将这个字段修改为 VARCHAR(36) 或者 CHAR(40),总之,不是 CHAR(36) 就可以了。
(近日正好有一个项目需要用到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() |
(例如使用 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) 就可以了。
相关文章推荐
- EasyUI ComboGrid 集成分页、按键示例
- cannot find -luuid
- UITextFiled长度限制
- 2016.07.08,英语,《Vocabulary Builder》Unit 24
- 数据库连接池优化配置(druid,dbcp,c3p0)
- AngularUI Router
- Can't load native library. CPU arch invalid for this build
- hdu 5057 Argestes and Sequence(离线处理树状数组)
- 自定义Collection View布局
- Buileder(生成器)—对象创建型模式
- JAVA后台拼接json map类型,MAP类型中的VALUE对应List
- build.gradle配置参数详解
- 这些天 我踩过的easyui的坑
- iOS6新特征:UICollectionView高级使用示例之CircleLayout
- 【源码】StringBuilder和StringBuffer源码深度剖析
- 审核相关 内购 UUID
- mysql 创建视图时提示View's SELECT contains a subquery in the FROM clause
- CnCrypt 文件属性批量修改工具,通过修改文件属性达到更好的伪装效果
- UIMenuViewController使用
- Easyui excel表格的导出