MySQL中文參考手冊譯者:晏子 (clyan@sohu.com)
GB 碼主頁:http://linuxdb.yeah.net
Big5 轉碼者:statue
(statue@bbs.yzu.edu.tw)
詞彙轉換:彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁:
http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站:
http://php.wilson.gs/mysqldoc/big5/manual_toc.html
MySQL利用MyODBC程式為ODBC提供支援。
MyODBC是在Windows95和Windows NT上的一個32位ODBC(2.50) level 0驅動程式。我們希望誰能將它移植到Windows 3.x。
MyODBC已經用Acess、Admndemo.exe、C++ Builder、Centura Team Developer(早先是Gupta SQL/Windows)、ColdFusion(在Solaris和用Server Pack 5的NT上)、Crystal Reports、DataJunction、Notes 4.5/4.6、SBSS、Perl DBD-ODBC、Paradox、Powerbuilder、Powerdesigner 32位、VC++和Visual Basic。
如果你聽說有任何其他的應用程式用MyODBC一起工作,請把它寄到myodbc@lists.mysql.com!
大多數程式應該可用MyODBC工作,但對下面列出的每一個,我們自己測試了它或從它運行的一些用戶得到了証實:
BLOB列為OLE OBJECTS。如果你想要有MEMO列,你應該用ALTER
TABLE把列改成TEXT。DATE列。如果你對此有一個問題,把列改為DATETIME。"Query|SQLSpecific|Pass-Through"來修正它。VARCHAR而非ENUM,因為它以能引起MySQL困惑的方式導出後者。CONCAT()函數作為字符串選擇他們。例如:select CONCAT(rise_time), CONCAT(set_time)
from sunrise_sunset;
這種方式作為字符串檢索出的值應該被Excel97識別為時間值,例子中CONCAT()的目的是欺騙ODBC認為列是“字符串類型”。沒有CONCAT(),ODBC知道列是時間類型,而Excel不理解它。注意這是Excel的一個錯誤,因為它自動將一個字符串轉換為一個時間。如果數據源是一個文本文件,這問題將很大,但是當數據源是對每列報告準確類型的一個ODBC連接時,只是有點傻。
fReg:= TRegistry.Create;
fReg.OpenKey('\Software\ODBC\ODBC.INI\DocumentsFab', True);
fReg.WriteString('Database', 'Documents');
fReg.WriteString('Description', ' ');
fReg.WriteString('Driver', 'C:\WINNT\System32\myodbc.dll');
fReg.WriteString('Flag', '1');
fReg.WriteString('Password', '');
fReg.WriteString('Port', ' ');
fReg.WriteString('Server', 'xmark');
fReg.WriteString('User', 'winuser');
fReg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True);
fReg.WriteString('DocumentsFab', 'MySQL');
fReg.CloseKey;
fReg.Free;
Memo1.Lines.Add('DATABASE NAME=');
Memo1.Lines.Add('USER NAME=');
Memo1.Lines.Add('ODBC DSN=DocumentsFab');
Memo1.Lines.Add('OPEN MODE=READ/WRITE');
Memo1.Lines.Add('BATCH COUNT=200');
Memo1.Lines.Add('LANGDRIVER=');
Memo1.Lines.Add('MAX ROWS=-1');
Memo1.Lines.Add('SCHEMA CACHE DIR=');
Memo1.Lines.Add('SCHEMA CACHE SIZE=8');
Memo1.Lines.Add('SCHEMA CACHE TIME=-1');
Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');
Memo1.Lines.Add('SQLQRYMODE=');
Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE');
Memo1.Lines.Add('ENABLE BCD=FALSE');
Memo1.Lines.Add('ROWSET SIZE=20');
Memo1.Lines.Add('BLOBS TO CACHE=64');
Memo1.Lines.Add('BLOB SIZE=32');
AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines);
在Windows95上,有3種可能性來指定伺服器名:
ip hostname
例如:
194.216.84.21 my
怎麼填寫“ODBC設置”的例子:
Windows DSN name: test Description: This is my test database MySql Database: test Server: 194.216.84.21 User: monty Password: my_password Port:
對Windows DSN name域的值是在你的Windows ODBC設置中唯一的任何名字。
你不必為在ODBC設置屏的Server, User, Password或Port域指定值。然而如果你這樣做,當你試圖做一個連接時,這些值將在以後作為內定值使用,那時你有改變值的選擇。
如果沒給出端口號,使用內定端口(3306)。
如果你指定選項Read options from C:\my.cnf,組client和odbc將從“C:\my.cnf”文件中讀出。你可以使用可用於mysql_options()的所有選項。見20.4.37 mysql_options()。
AUTO_INCREMENT列的值一個常見的問題是怎樣得到一個自動從一個INSERT產生的ID值,用ODBC,你可以這樣做(假定auto是一個AUTO_INCREMENT字段):
INSERT INTO foo (auto,text) VALUES(NULL,'text'); SELECT LAST_INSERT_ID();
或,如果你是只是想把ID插入到另外一個表中,你可以這樣做:
INSERT INTO foo (auto,text) VALUES(NULL,'text'); INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text');
得益於一些ODBC應用程式(至少Delphi和Access),下列查詢可被用來找出最新插入的行:
SELECT * FROM tbl_name WHERE auto IS NULL;
如果你碰到MyODBC困難,你應該通過ODBC管理器制作一個日誌文件(當從ODBCADMIN要求日誌時,你獲得的日誌文件)和一個MyODBC日誌文件來開始。為了獲得一個MyODBC日誌文件,在MyODBC連接/配置屏幕上標注“Trace
MyODBC”選項標誌。日誌文件將被寫入文件“C:\myodbc.log”。注意為了此選項起作用,你必須使用MYSQL.DLL而不是MYSQL2.DLL!
檢查MyODBC發給MySQL伺服器的查詢﹔你應該可以通過在“myodbc.log”文件中尋找字符串>mysql_real_query找到它。
你也應該試著在mysql監視器或admndemo中重複查詢以找出是MyODBC出錯還是MySQL出錯。
如果你發現某些東西是錯的,請值將相關的行(最大40排)發到myodbc@lists.mysql.com。請決不要發送整個MyODBC或ODBC日誌文件!
如果你不能找出是什麼錯誤,最後的選擇制作一個檔案(tar或zip),包含一個MyODBC日誌文件,ODBC日誌文件和一個解釋這個問題的 README文件。你可以把這發到ftp://www.mysql.com/pub/mysql/secret。至於在TCX的我們能訪問你上載的文件並且我們將分離數據!
如果你能創造一個也顯示出這個問題的程式,請也上載它!
如果程式與一些其他SQL伺服器一起工作,你應該制作一個 ODBC 日誌文件,在哪兒你在其他SQL伺服器做完全一樣的事情。
記住,你能提供我們越多的資訊,我們越可能解決這個問題!