線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5485
推到 Plurk!
推到 Facebook!

MYSQL BLOB與中文BIG5碼的問題!

尚未結案
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-20 19:52:31 IP:192.168.xxx.xxx 未訂閱
請教一下!(特別請教Ethan )    我使用WINNT的MYSQL,將MY.INI的設定為 [mysqld] default-character-set=big5 就可以順利支援BIG5指令 但是卻造成無法將圖檔存入BLOB欄位 採用這個指令寫入圖檔 TBlobField(ADOTable1.FieldByName('IMAGE_FIELD')).loadfromfile(OpenPictureDialog1.filename); 會出現 將my.ini的big5設定去掉就不會出現此錯誤 有人知道 如何 將my.ini設定為big5 又可以順利寫入圖檔到blob中? 感謝指教! ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-20 22:38:21 IP:61.64.xxx.xxx 未訂閱
不知天使 用的是那一版 我看書仔(書逸兄) 不知道是否有空說明一下 哈哈 請問天使 把圖片存入資料庫 真正的 絕對 好處 到底是為了甚麼 相同問題 http://bbs.nsysu.edu.tw/txtVersion/boards/sequel/M.1057801514.A.html 此為轉貼 不過是php的 http://xch6636.51.net/mysql/mysql15.php 如何將圖片儲存在MySQL資料庫裏 ( 2003-08-03 8:42 ) 如果你想把二進位的資料,比如說圖片文件和HTML文件,直接保存在你的MySQL資料庫,那麽這篇文章就是爲你而寫的!我將告訴你怎樣通過HTML表單來儲存這些文件,怎樣訪問和使用這些文件。 本文概述: 。在mysql中建立一個新的資料庫 。一個怎樣儲存文件的例副程式 。一個怎樣訪問文件的例副程式 在mysql中建立一個新的database 首先,你必須在你的mysql中建立一個新的資料庫,我們將會把那些二進位文件儲存在這個資料庫裏。在例子中我會使用下列結構,爲了建立資料庫, 你必須做下列步驟: 。進入MySql控制器 。輸入命令"create database binary_data;" 。輸入命令"use binary_data;" 。輸入命令 "CREATE TABLE binary_data ( id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,description CHAR(50), bin_data LONGBLOB, filename CHAR(50), filesize CHAR(50), filetype CHAR(50));" (不能斷行) 如果沒有意外,資料庫 和 表 應該建立好了。 一個怎樣儲存文件的例副程式 用這個例子你可以通過Html表單將文件傳輸到資料庫中。 store.php3 ?> Store binary data into SQL Database $id"; MYSQL_CLOSE(); } else { // 否則顯示儲存新資料的表單 ?> " enctype="multipart/form-data"> File Description: File to upload/store in database: 如果你執行了這個程式,你將會看見一個簡單的Html表單,單擊“瀏覽”選擇一個文件,然後單擊提交。 當文件上傳至web伺服器之後,程式將會告訴你剛剛上傳的文件的ID,記住這個ID,待會要用的。 一個怎樣訪問文件的例副程式 你可以通過這個程式訪問你剛才儲存的文件 // 調用方法: getdata.php3?id= if($id) { // 你可能需要調整主機名,用戶名和密碼: @MYSQL_CONNECT( "localhost", "root", "password"); @mysql_select_db( "binary_data"); $query = "select bin_data,filetype from binary_data where id=$id"; $result = @MYSQL_QUERY($query); $data = @MYSQL_RESULT($result,0, "bin_data"); $type = @MYSQL_RESULT($result,0, "filetype"); Header( "Content-type: $type"); echo $data; }; ?> 程式必須知道要訪問那個文件, 你必須將ID作爲一個參數。 例如: 一個文件在資料庫中的ID爲2. 你可以這樣調用它: getdata.php3?id=2 如果你將圖片儲存在資料庫裏, 你可以向調用圖片一樣調用它。 Example: 一個圖片文件在資料庫中的ID爲3. 你可以這樣調用它: 怎樣儲存大於1MB的文件: 如果你想儲存大於1MB的文件,你必須對你的程式、PHP設置、SQL設置進行許多修改,。 下面幾條也許可以幫助你儲存小於24MB的文件: 1、修改 store.php3 ,將 MAX_FILE_SIZE 的值改成 24000000。 2、修改你的PHP設置,在一般情況下,PHP只允許小於2MB的文件,你必須將max_filesize(在php.ini中)的值改成24000000 3、去掉MYSQL的資料包大小限制,在一般情況下 MYSQL 小於1 MB的資料包. 4、你必須用以下參數重啓你的MYSQL /usr/local/bin/safe_mysqld -O key_buffer=16M -O table_cache=128 -O sort_buffer=4M -O record_buffer=1M -O max_allowed_packet=24M 5、如果仍然出錯: 可能是超時錯誤,如果你通過一個很慢的連接來儲存一個很大的文件,PHP缺省的時間限制爲30秒。你可以將max_execution_time(在php.ini中)的值改爲-1 出自:http://www.fanqiang.com ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起 發表人 - jackkcg 於 2003/10/20 23:36:55
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-21 08:28:08 IP:192.168.xxx.xxx 未訂閱
感謝J Sir回應, 我的問題的確如http://bbs.nsysu.edu.tw/txtVersion/boards/sequel/M.1057801514.A.html 這一篇所說的一樣,不知有沒有解?  
引言: 我的mysql的default-character-set=big5 當我要以JSP存圖檔到mysql的blob型式就會出現error, 這個問題我找了很久都沒有找到, 我在想是有可能是圖片存進去會因default-character-set=big5所造成的問題 但沒有default-character-set=big5,又會到'許','功','蓋'的問題 ,不知道是否有人解決成功這個mysql的問題, 只聽到有人說做成file存取,但不是我想要的 網路上也少有人在討論這重大的bug, 希望有人可以提供一些相關的解決方案
將圖片存入資料庫,主要的目的是要讓所有的工作站電腦都可以隨時查出資料, 而不用將主機的硬碟目錄分享出來 甚至將來透過Web來查詢資料庫的圖檔資料也是很方便 事實上我放的不是圖檔(而是一些文件檔,如傳真擋或Word檔案) ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-21 08:34:40 IP:192.168.xxx.xxx 未訂閱
對了 我用的資料庫為 MYSQL 4.01 MY ODBC 3.51 採用ADO元件 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-21 11:53:57 IP:218.163.xxx.xxx 未訂閱
參考看看:     
//載入檔案存入MySQL的LONGBLOB欄位
procedure TForm1.Button1Click(Sender: TObject);
var
   MyFilestream:TFileStream;
   MyBlob:TBlobField;
begin
 if OpenDialog1.Execute then
 begin
  ADOQuery1.Open;
  ADOQuery1.Append;
  MyFilestream:=TFileStream.Create(OpenDialog1.FileName,fmopenread);
  try
   MyFilestream.seek(0,0);
   MyBlob:=TBlobField(ADOQuery1.FieldByName('myfile'));
   MyBlob.LoadFromStream(MyFilestream);
  finally
   MyFilestream.Free;
  end;
  ADOQuery1.Post;
 end;
end;
 
網海無涯,學無止境!
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-21 13:20:37 IP:192.168.xxx.xxx 未訂閱
引言: 參考看看:
//載入檔案存入MySQL的LONGBLOB欄位
procedure TForm1.Button1Click(Sender: TObject);
var
   MyFilestream:TFileStream;
   MyBlob:TBlobField;
begin
 if OpenDialog1.Execute then
 begin
  ADOQuery1.Open;
  ADOQuery1.Append;
  MyFilestream:=TFileStream.Create(OpenDialog1.FileName,fmopenread);
  try
   MyFilestream.seek(0,0);
   MyBlob:=TBlobField(ADOQuery1.FieldByName('myfile'));
   MyBlob.LoadFromStream(MyFilestream);
  finally
   MyFilestream.Free;
  end;
  ADOQuery1.Post;
 end;
end;
 
網海無涯,學無止境!
採用這個Stream的方法寫入MYSQL一樣會有錯誤 若將MY.INI的BIG5設定移除 就可以成功 所以我想不是寫入MYSQL的指令方法 而是MYSQL本身的BIG5的字元集會使得BLOB的寫入出問題 (可能是MYSQL針對BLOB中的Binary Code , 拿來當作 BIG5碼處理的關係吧?) ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-21 20:01:09 IP:61.221.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=33237 如果你使用以所謂的big5編碼的中文數據,你要使所有的字符列是BINARY,它可行,是因為big5編碼字符的排序順序基于 ASCII代碼的順序 http://linux.tnc.edu.tw/techdoc/mysql/mysql_doc/manual_Problems.html http://freebsd.sinica.edu.tw/~majordom/freebsd-taiwan-questions/freebsd-taiwan-questions.200007/msg01527.html http://freebsd.sinica.edu.tw/pipermail/freebsd-taiwan-questions/2001-October/013765.html http://php.isu.edu.tw/manual/ja/ref.image.php ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-22 06:43:37 IP:192.168.xxx.xxx 未訂閱
引言: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=33237 如果你使用以所謂的big5編碼的中文數據,你要使所有的字符列是BINARY,它可行,是因為big5編碼字符的排序順序基于 ASCII代碼的順序 http://linux.tnc.edu.tw/techdoc/mysql/mysql_doc/manual_Problems.html http://freebsd.sinica.edu.tw/~majordom/freebsd-taiwan-questions/freebsd-taiwan-questions.200007/msg01527.html http://freebsd.sinica.edu.tw/pipermail/freebsd-taiwan-questions/2001-October/013765.html http://php.isu.edu.tw/manual/ja/ref.image.php ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
感謝J Sir,看過所有您列的網址! 事實上我現在就是用Binary暫時解決問題, Binary可以在Create Table時指定某個欄位採用Binary方式存取, 或是在Select指令時,如Like 或 Order by 指令用Binary的方式處理, 這樣就可以解決因為MYSQL的資料處理英文大小寫不分,造成處理中文字時(中文字有時後第二個byte中會有英文字),如like指另會找錯資料,會是Order by的中文排序不正常! 但是這樣還是有不便的地方,比如說:無法預期欄位中的資料會輸入中文會是純英文,如果是英文的資料.原本like可以大小寫不分的,加上binary之後就變成大小寫會分別了! 在MY.INI中加上default-character-set=big5,總是一勞永逸的辦法,無奈會與BLOB存入衝突,不知以後的MYSQL版本是否會改善? ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-22 06:51:15 IP:192.168.xxx.xxx 未訂閱
以下是我詢問darings的回覆 相關網址http://bbs.nsysu.edu.tw/txtVersion/boards/sequel/M.1057801514.A.html  
引言: Sorry!jsp還是找不到任何答案,我只好做成圖片存在資料夾,只有mysql會有圖片存取的問題,其他的資料庫倒是沒有這個問題,PHP Mysql倒是可以解決此問題,但是mysql不能設成 default-character-set=big5,而是用預設的就沒有什麼問題, 建議你找PHP有關圖檔的寫法 darings留
~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
Ethan
版主


發表:101
回覆:170
積分:78
註冊:2006-07-05

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-10-23 09:15:16 IP:218.4.xxx.xxx 未訂閱
站長大大您好,各位前輩們好^^ 小弟因為現在人在大陸,所以今天好不容易可以上網,結果一看站長在20日的留言我確在今天回覆,真是不好意思! MySQL目前在BIG5 support上還是有很大的問題,所以為了克服站長的問題我是用了底下得方式: query1.Close; query1.SQL.Clear; query1.SQL.Add('insert into pic(id,picture)values(null,LOAD_FILE(:q1))'); query1.ParamByName('q1').AsString:=OpenDialog1.FileName; query1.ExecSQL; 就是在SQL script裡用上了MySQL LOAD_FILE function就可以必免掉不必要的問題. 看各位前輩們還有沒有更好的方式,大家可以提出來討論,謝謝! 學習,從分享開始^^
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-10-23 13:38:14 IP:192.168.xxx.xxx 未訂閱
引言: 站長大大您好,各位前輩們好^^ 小弟因為現在人在大陸,所以今天好不容易可以上網,結果一看站長在20日的留言我確在今天回覆,真是不好意思! MySQL目前在BIG5 support上還是有很大的問題,所以為了克服站長的問題我是用了底下得方式: query1.Close; query1.SQL.Clear; query1.SQL.Add('insert into pic(id,picture)values(null,LOAD_FILE(:q1))'); query1.ParamByName('q1').AsString:=OpenDialog1.FileName; query1.ExecSQL; 就是在SQL script裡用上了MySQL LOAD_FILE function就可以必免掉不必要的問題. 看各位前輩們還有沒有更好的方式,大家可以提出來討論,謝謝! 學習,從分享開始^^
感恩,果然是MYSQL的高手, 您解決了我多日來的問題! 我的做法如下:
adoquery1.Close;
adoquery1.sql.text:='INSERT INTO pic (pic_data) values(LOAD_FILE('''   stringreplace(OpenPictureDialog1.filename,'\','\\',[rfReplaceAll])   '''))';
adoquery1.execsql;
~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-10-23 21:18:24 IP:192.168.xxx.xxx 未訂閱
補充一點 LOAD_FILE所用的檔案路徑必需為MYSQL DataBase Server所在的實體硬碟路徑 若在Local連上Remote Server時,必須先將檔案上傳到主機後 才可以執行LOAD_FILE指令喔 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
Ethan
版主


發表:101
回覆:170
積分:78
註冊:2006-07-05

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-10-24 08:32:37 IP:218.4.xxx.xxx 未訂閱
引言: 補充一點 LOAD_FILE所用的檔案路徑必需為MYSQL DataBase Server所在的實體硬碟路徑 若在Local連上Remote Server時,必須先將檔案上傳到主機後 才可以執行LOAD_FILE指令喔 ~~~Delphi K.Top討論區站長~~~
嗯,我也有發覺這一點,不過問題有解決就好^^ 學習,從分享開始^^
morepatric
一般會員


發表:9
回覆:17
積分:5
註冊:2003-07-21

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-12-12 22:28:33 IP:221.169.xxx.xxx 訂閱
前陣子也有遇到亂碼的問題,和各位分享一下我的解決方法:
除了Mysql本身的設定外,
可以在.dfm的SQLConnection1元件上,手動加入'ServerCharset=big5'這字串!

以下是我的設定內容:
object SQLConnection1: TSQLConnection
ConnectionName = 'tounsen'
DriverName = 'MySQL'
GetDriverFunc = 'getSQLDriverMYSQL50'
LibraryName = 'dbxopenmysql50.dll'
LoginPrompt = False
Params.Strings = (
'GetDriverFunc=getSQLDriverMYSQL50'
'LibraryName=dbxopenmysql50.dll'
'VendorLib=libmysql.dll'
'DriverName=MySQL'
'DriverUnit=DBXDynalink'
'DriverPackageLoader=TDBXDynalinkDriverLoader'
'DriverPackage=DbxCommonDriver120.bpl'
'DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader'

'DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,'
'Culture=neutral,PublicKeyToken=a91a7c5705831a4f'
'HostName=127.0.0.1'
'Database=tounsen'
'User_Name=xxx'
'Password=xxx'
'BlobSize=-1'
'ErrorResourceFile='
'LocaleCode=0000'
'Compressed=False'
'Encrypted=False'
'ServerCharset=big5')
VendorLib = 'libmysql.dll'
AfterConnect = SQLConnection1AfterConnect
Left = 88
Top = 8
end
系統時間:2024-04-26 6:18:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!