MySQL中char(36)被認為是GUID導致的BUG及解決方案

來源:互聯網
上載者:User

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.