none
[VB6 + MySQL] 字元集及字串欄位的設定問題! RRS feed

  • 問題

  • 剛使用了 MySQL 數個月,但一直存在著一個問題,就是偶然會在更新資料庫時,會產生執行時期錯誤,如下:

     

    [-2147217887] 多重步驟操作發生生錯誤,請檢查每一個狀態值。

     

    程式是會安裝到不同電腦執行的,當中包括了不同的 Windows 版本(例如 XP 或 2000 等),至於會在甚麼情況發生上述的問題,則無法估計(但應該與字元集及字串資料欄位的設定有關),即使在不同電腦但設定相同的環境下,都可能會有不同的結果!

     

    大家有否偶過這些問題?如下的設定是否正確呢?

     

    由於資料庫是會儲存繁體(big5)或簡體中文(gb2312)字的,所以用 Unicode(utf8)來儲存,方便管理。

     

    開發工具:

     

    VB6 (SP6)

    ADO 2.8

     

    資料庫及 ODBC 驅動程式:

     

    MySQL 5.0.27-community-nt

    MySQL ODBC Driver 3.51

     

    建立資料庫時,指定預設的字元集為 Unicode (utf8):

     

      CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8;

     

    於程式執行並連線到資料庫後,執行如下指令,指定使用的字元集:

     

      SET NAMES big5;

     

     

      SET NAMES gb2312;

     

    會否是 VB6 需要有不同的設定?

     

    謝謝!

     

    2007年4月10日 下午 03:31

解答

  • 這個錯誤訊息是某些欄位與資料庫內的規則不一致,比如說限制不能為空白的欄位、限制不能為 Null 的欄位、或是字串長度超過欄位限制。

     

    字元編碼錯的話,應該是告訴你 SQL 語法無法辨識或哪裡錯誤。

     

    可能相關的,比如說你姓名欄位你假設最多四個字,歐陽菲菲 之類的。

    說實在,我不知道在 utf8 下該設多少。所以我使用 ucs2 ,設 8 bytes (4 個字元)

    utf8 一個中文字可能會有 1 ~ 4 bytes ,算起來最大應該到 16 bytes,資料庫依據效能規劃來說,通常欄位是固定 bytes 數,不是變動長度,除了備忘欄位用遠程指標外。MySQL 線上說明並沒有針對這部份說明,我不知道 utf8 內設定長度到底指的是字元長度還是 bytes 數。

    所以有可能發生你塞一段長字串經過轉碼後,變成超過欄位的長度限制。

     

     

    2007年4月11日 上午 03:04
    版主
  • MySQL 的問題,請到 MySQL 官方網站,論壇或是 User Group 去發問或找資料。

    畢竟 MySQL 不是 "MSSQL",沒用過要怎麼回答?

     

    再者,免費的東西是否真的能夠完全充份支援到 Business Critical Mission? 我自己是有點存疑的。

    光是一個 support 就夠企業受的了。

    2007年4月12日 上午 05:15
    版主
  • 您的問題似乎是出在資料欄的型態不同所致。

     

    關於 MySQL 的編碼問題,以下分享我轉換為 2005 之後的心得,而 vb6 + myodbc 對於 unicode 仍是有氣無力,只能以 big5 為編碼來溝通。

     

    在倒數第五篇

    http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=1414911&SiteID=14

    2007年4月12日 上午 11:48
  • ODBC 的部份我是仍寄有些許期望,如我上文所述, 3.51 針對已全設為 utf8 的  server 是被距絕連線,而 5.0 可以連線,只是取回為亂碼,至少可以連線了,所以我想下一版說不定就可以支援 utf8 囉
    2007年4月14日 上午 01:23

所有回覆

  • 這個錯誤訊息是某些欄位與資料庫內的規則不一致,比如說限制不能為空白的欄位、限制不能為 Null 的欄位、或是字串長度超過欄位限制。

     

    字元編碼錯的話,應該是告訴你 SQL 語法無法辨識或哪裡錯誤。

     

    可能相關的,比如說你姓名欄位你假設最多四個字,歐陽菲菲 之類的。

    說實在,我不知道在 utf8 下該設多少。所以我使用 ucs2 ,設 8 bytes (4 個字元)

    utf8 一個中文字可能會有 1 ~ 4 bytes ,算起來最大應該到 16 bytes,資料庫依據效能規劃來說,通常欄位是固定 bytes 數,不是變動長度,除了備忘欄位用遠程指標外。MySQL 線上說明並沒有針對這部份說明,我不知道 utf8 內設定長度到底指的是字元長度還是 bytes 數。

    所以有可能發生你塞一段長字串經過轉碼後,變成超過欄位的長度限制。

     

     

    2007年4月11日 上午 03:04
    版主
  • 其實我之前試過,將欄位定義為 varchar(200),然後新增紀錄,並設定此欄資料為一個至三數個中文字,錯誤依然會發生。

     

    曾經有數次,發現了一個現象,建立了資料表後,當中含有一個 varchar(15) 的欄位,新增一個紀錄,並將此欄位值設定為 3 個英文字母或數字,自此之後,所有在此資料表所新增的紀錄中,若將此欄位值設定為長度超過 3 位的話,錯誤就(一定)會發生(若第一個紀錄中此欄位的長度為 5,那麼從此於這個欄位的資料值,就不能長於 5 個位,如此類推)。

     

    當然,正如我之前所說,並不是每部電腦,都會發生相同情況的,錯誤的發生,全然是無從預料的。

     

    昨天,在官方網站下載了最新版本(3.51.14,剛於上月 Release)的 ODBC 驅動程式,然後嘗試在一部 Windows 2000 中換掉了舊有的(3.51.12),而該電腦在之前已被確定是會發生錯誤的,但於換掉了新驅動程式之後再試,問題便沒有再發生了。今天,還於另一部 XP 電腦中安裝程式及新的驅動程式,及進行測試,沒有錯誤發生。

     

    由於(似乎)只要換掉驅動程式,無需作任何設定或改變,便能阻止錯誤的發生,所以我懷疑,問題是源於驅動程式的。

     

    然而,當我認為新的驅動程式,可以完全解決這個問題之時,錯誤卻又再於一部(簡體中文版)XP 中再次出現了。之後我將資料庫的預設字元集,改為 gb2312,然後再執行,但錯誤依然「揮之不去」!

     

    姑且不論 Unicode,其實,我只是要建立資料表,存取含有中文字的紀錄而已,我該怎麼做才對呢?為何這樣簡單,這樣基本的要求,是那麼困難,以幾個月的時間,依然無法解決,甚至仍然無從入手的呢?還是這個間題,根本是沒有解決的辦法?

     

    謝謝!

     

    2007年4月11日 下午 02:35
  • 照你目前的說明,問題發生在 MyODBC / MySQL ,這類問題建議你上 MySQL 官方網站的討論版發問,產品內部問題,外人無法去猜測與估計。

     

    我自己沒有切來切去,一律資料庫預設編碼、內部編碼採用 ucs2 ,外部傳輸用 big5 ,在先前的版本沒有你說的問題。

     

    非委辦單位要求的前提下,我一律不建議使用 MySQL ,因為 MySQL 的授權協議,正常來說,除了公開原始碼外,幾乎都要購買商業授權,我自己多半使用 SQL Server / Access 。

     

    我的經驗分享在這:http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!763.entry

    2007年4月11日 下午 02:50
    版主
  • 我也最喜歡用 Access,簡單,易用,輕巧,無奈卻不支援多人存取。

     

    其實之前也是用 SQL Server 2005 Express 的,但因這個免費版本,並不提供 Replication 功能,但 MySQL 卻有提供,所以才轉用了。

     

    順帶一問,若以 MySQL 所提供的 Replication(複製),可否達到如下的目的:

     

    1 ) 讓程式可以多連接一個後備資料庫,當總資料庫出現問題的時候(例如離線),即自動以後備資料庫,暫時替代,直到總資料庫再次連線時,會自動與後備資料庫,進行資料同步的程序。

     

    2 ) 一間有數間分店的舖,每間分店各有其自己的(Local)資料庫,另外,還有一個中央資料庫伺服器,每個 Local 的資料庫均與總資料庫透過互聯網連接,於線路狀態正常時,會進行資料同步程序。而分店方面:

    • 會將交易資料儲存到 Local 資料庫
    • 交易資料會透過資料同步程序,上傳到總資料庫
    • 將已上載到總資料庫的交易資料,下載到其他分店的 Local 資料庫
    • 於總資料庫,下載已由其他分店,上載到總資料庫的交易資料到 Local 資料庫。

    謝謝!

     

    2007年4月11日 下午 06:20
  • MySQL 的問題,請到 MySQL 官方網站,論壇或是 User Group 去發問或找資料。

    畢竟 MySQL 不是 "MSSQL",沒用過要怎麼回答?

     

    再者,免費的東西是否真的能夠完全充份支援到 Business Critical Mission? 我自己是有點存疑的。

    光是一個 support 就夠企業受的了。

    2007年4月12日 上午 05:15
    版主
  • 您的問題似乎是出在資料欄的型態不同所致。

     

    關於 MySQL 的編碼問題,以下分享我轉換為 2005 之後的心得,而 vb6 + myodbc 對於 unicode 仍是有氣無力,只能以 big5 為編碼來溝通。

     

    在倒數第五篇

    http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=1414911&SiteID=14

    2007年4月12日 上午 11:48
  • 謝謝你,不過我用的是 VB6,所以用不到 .NET 的 Connector 了!

     

    說的也是,有很多人都以為 MySQL 是完全免費的,我當初決定選用的時候,也是一樣。

     

    其實,經過這幾個月的教訓,我對 MySQL 已不再寄予甚麼厚望了!!

    2007年4月13日 下午 03:27
  • ODBC 的部份我是仍寄有些許期望,如我上文所述, 3.51 針對已全設為 utf8 的  server 是被距絕連線,而 5.0 可以連線,只是取回為亂碼,至少可以連線了,所以我想下一版說不定就可以支援 utf8 囉
    2007年4月14日 上午 01:23