MYSQL BLOB與中文BIG5碼的問題! |
尚未結案
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
請教一下!(特別請教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 發送簡訊給我 |
不知天使 用的是那一版 我看書仔(書逸兄) 不知道是否有空說明一下 哈哈 請問天使 把圖片存入資料庫 真正的 絕對 好處 到底是為了甚麼 相同問題
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 發送簡訊給我 |
感謝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 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
參考看看:
//載入檔案存入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 發送簡訊給我 |
引言: 參考看看:採用這個Stream的方法寫入MYSQL一樣會有錯誤 若將MY.INI的BIG5設定移除 就可以成功 所以我想不是寫入MYSQL的指令方法 而是MYSQL本身的BIG5的字元集會使得BLOB的寫入出問題 (可能是MYSQL針對BLOB中的Binary Code , 拿來當作 BIG5碼處理的關係吧?) ~~~Delphi K.Top討論區站長~~~//載入檔案存入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;網海無涯,學無止境!
------
~~~Delphi K.Top討論區站長~~~ |
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
以下是我詢問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 發送簡訊給我 |
站長大大您好,各位前輩們好^^
小弟因為現在人在大陸,所以今天好不容易可以上網,結果一看站長在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 發送簡訊給我 |
引言: 站長大大您好,各位前輩們好^^ 小弟因為現在人在大陸,所以今天好不容易可以上網,結果一看站長在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 發送簡訊給我 |
|
Ethan
版主 發表:101 回覆:170 積分:78 註冊:2006-07-05 發送簡訊給我 |
|
morepatric
一般會員 發表:9 回覆:17 積分:5 註冊:2003-07-21 發送簡訊給我 |
前陣子也有遇到亂碼的問題,和各位分享一下我的解決方法:
除了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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |