全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3007
推到 Plurk!
推到 Facebook!

怪事,用SQL新增中文資料沒問題,用DBGrid等控件會失敗

答題得分者是:P.D.
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-08-19 21:32:42 IP:61.218.xxx.xxx 訂閱
Delphi2009+zeos+Mysql5

一個困擾很久的問題了,爬文還是找不到答案!欄位型態是varchar utf8_unicode!

中文顯示是沒問題,而用SQL進行Insert Into也能儲存中文,但如果用DBGrid等控件進行資料修改和新增,英文和數字資料沒問題,但中文資料就會發生錯誤,不是亂碼就是會發生資料無法更新的錯誤,請問這是什麼問題?謝謝!
smallfox
高階會員


發表:2
回覆:113
積分:128
註冊:2003-02-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-08-22 00:44:24 IP:203.67.xxx.xxx 訂閱
可否描述你使用哪種 TDataSet & 你使用哪種方式連接到 Database ?
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-08-22 17:01:01 IP:118.169.xxx.xxx 未訂閱
看起來這已是大家所討論到爛的Delphi支援unicode版本的問題, 建議你搜尋本站一下吧!
===================引 用 pcernet 文 章===================
Delphi2009 zeos Mysql5

一個困擾很久的問題了,爬文還是找不到答案!欄位型態是varchar utf8_unicode!

中文顯示是沒問題,而用SQL進行Insert Into也能儲存中文,但如果用DBGrid等控件進行資料修改和新增,英文和數字資料沒問題,但中文資料就會發生錯誤,不是亂碼就是會發生資料無法更新的錯誤,請問這是什麼問題?謝謝!
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-08-22 21:07:20 IP:61.218.xxx.xxx 訂閱

感謝您的熱心,我爬文爬很久了,這絕對不是討論到爛的問題,一般人都出在編碼utf8和設定SET NAMES big5的問題,我沒有這些問題,輸出輸入中文都正常,只是如果是使用控件,便無法正常儲存中文資料!
我使用的是ZEOS的TZConnection和TZQuery,如果使用SQL操作資料新增或更新中文資料,都能正常操作,只是如果配合DataSource用dbGrid等控件直接新增或修改中文資料,便會出現中文資料沒有儲存的情況,甚至會出現0 Record(s) Update的錯誤,謝謝指教。

===================引 用 smallfox 文 章===================
可否描述你使用哪種 TDataSet & 你使用哪種方式連接到 Database ?
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-08-22 22:34:50 IP:118.169.xxx.xxx 未訂閱
1.DBgrid 在Delphi2009之前根本不支援unicode功能, 這已是討論很多的案例
2.由於你不是使用標準TQuery來操作, 所以根本無法做比較, 建議你全部改用Delphi內建的元件來操作看看會不會有問題, 再判斷是否支援utf-8的字集
===================引 用 pcernet 文 章===================

感謝您的熱心,我爬文爬很久了,這絕對不是討論到爛的問題,一般人都出在編碼utf8和設定SET NAMES big5的問題,我沒有這些問題,輸出輸入中文都正常,只是如果是使用控件,便無法正常儲存中文資料!
我使用的是ZEOS的TZConnection和TZQuery,如果使用SQL操作資料新增或更新中文資料,都能正常操作,只是如果配合DataSource用dbGrid等控件直接新增或修改中文資料,便會出現中文資料沒有儲存的情況,甚至會出現0 Record(s) Update的錯誤,謝謝指教。

===================引 用 smallfox 文 章===================
可否描述你使用哪種 TDataSet & 你使用哪種方式連接到 Database ?
smallfox
高階會員


發表:2
回覆:113
積分:128
註冊:2003-02-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-08-23 00:57:42 IP:211.74.xxx.xxx 訂閱
1. 使用 TDBEdit or TDBComboBox 也會嗎 ?

2. 中文資料輸入後, 回存後端後變成亂碼, 我到是見過, 但是發生 0 Record Update, 應該與輸入中文無關吧.

3. 你使用的是 ZEOS Delphi 2009, 在這之前是否使用過 ZEOS Delphi 其他版本呢 ?

4. 在 BeforePost 事件中, 你可能要將資料做 UnicodeToUtf8 的轉換.
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-08-23 08:48:02 IP:114.27.xxx.xxx 訂閱
感謝兩位熱情回覆,我試到一個情況,dbGrid編輯時,如果在中文後面加上足夠的空白,就沒有問題,否則儲存中文後,可能字會被裁掉,或剩下半個中文而顯示?號,或是出現0 Reocrd(s) Updated的錯誤,欄位形態Varchar、char都試過了,謝謝指教。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-08-23 10:15:33 IP:118.169.xxx.xxx 未訂閱
這便是我所提的, 在於unicode的資料庫字集上, 一個中文是一個byte, 所以很可能是在截取是造成出現ascii碼不可視的字元, 如chr(13), chr(31)等等, 所以如果你想解決unicode, 建議改換成全面支援的Delphi2010以後版本
===================引 用 pcernet 文 章===================
感謝兩位熱情回覆,我試到一個情況,dbGrid編輯時,如果在中文後面加上足夠的空白,就沒有問題,否則儲存中文後,可能字會被裁掉,或剩下半個中文而顯示?號,或是出現0 Reocrd(s) Updated的錯誤,欄位形態Varchar、char都試過了,謝謝指教。
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-08-23 10:43:59 IP:114.27.xxx.xxx 訂閱
謝謝,因為家裡的電腦(XP)是一樣D2009的環境但沒有這個問題,而公司的電腦(WIN7)卻有這個問題,所以不確定改成Delphi2010能夠解決這個問題,不過我會試試看的,謝謝您的意見。
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-08-23 12:38:09 IP:114.27.xxx.xxx 訂閱
目前已經改成Delphi2010,還是一樣的問題,我會試著使用其他的連接器控件再試試,謝謝!
1.用SQL語法新增或修改中文資料沒問題.
2.用DBGrid控件時,遇到中文資料需要在後面加上空白,五個中文字就再加五個空白,這樣才能正常寫入。
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-08-23 13:44:24 IP:114.27.xxx.xxx 訂閱
目前改成 <!-- end: nav_sep_active --><!-- start: nav_bit_active -->UniDAC 已能完全正常使用,還是不知道問題在哪裡?
系統時間:2024-04-24 16:17:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!