zoukankan      html  css  js  c++  java
  • MySQL中char(36)被认为是GUID导致的BUG及解决方案

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

    有时候在使用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) 就可以了。

  • 相关阅读:
    采用GRE隧道连接不同虚拟机上的mininet网络
    ubuntu下安装Pycharm
    Update to openvswitch 2.3.0
    安装Openvswich 2.3.0
    ubuntu安装git
    解决Vmware Vsphere中虚拟机与本地机复制粘贴问题
    windows下安装python的xlrd和xlwd安装包
    ubuntu 下NetworkX的安装和使用
    大整数乘法 python实现
    推特(Twitter)的Snowflake算法——用于生成唯一ID
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/4758897.html
Copyright © 2011-2022 走看看