MySQL常見(jiàn)錯(cuò)誤問(wèn)答.doc_第1頁(yè)
MySQL常見(jiàn)錯(cuò)誤問(wèn)答.doc_第2頁(yè)
MySQL常見(jiàn)錯(cuò)誤問(wèn)答.doc_第3頁(yè)
MySQL常見(jiàn)錯(cuò)誤問(wèn)答.doc_第4頁(yè)
MySQL常見(jiàn)錯(cuò)誤問(wèn)答.doc_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

MySQL常見(jiàn)錯(cuò)誤問(wèn)答!2005年02月16日12:52查看3112次作者: 【大 中 小】文章分類(lèi):數(shù)據(jù)庫(kù)技術(shù) 18.2.1 MySQL server has gone away錯(cuò)誤本小節(jié)也涉及有關(guān)Lost connection to server during query的錯(cuò)誤。對(duì)MySQL server has gone away錯(cuò)誤最常見(jiàn)的原因是服務(wù)器超時(shí)了并且關(guān)閉了連接。缺省地,如果沒(méi)有事情發(fā)生,服務(wù)器在 8個(gè)小時(shí)后關(guān)閉連接。你可在啟動(dòng)mysqld時(shí)通過(guò)設(shè)置wait_timeout變量改變時(shí)間限制。你可以通過(guò)執(zhí)行mysqladmin version并且檢驗(yàn)正常運(yùn)行的時(shí)間來(lái)檢查MySQL還沒(méi)死掉。如果你有一個(gè)腳本,你只須再發(fā)出查詢(xún)讓客護(hù)進(jìn)行一次自動(dòng)的重新連接。在這種請(qǐng)下,你通常能獲得下列錯(cuò)誤代碼(你得到的是OS相關(guān)的):CR_SERVER_GONE_ERROR 客戶(hù)不能發(fā)送一個(gè)問(wèn)題給服務(wù)器。 CR_SERVER_LOST 當(dāng)寫(xiě)服務(wù)器時(shí),客戶(hù)沒(méi)有出錯(cuò),但是它沒(méi)有得到對(duì)問(wèn)題的一個(gè)完整的答案(或任何答案)。 如果你向服務(wù)器發(fā)送不正確的或太大的查詢(xún),你也可能得到這些錯(cuò)誤。如果mysqld得到一個(gè)太大或不正常的包,它認(rèn)為客戶(hù)出錯(cuò)了并關(guān)閉連接。如果你需要較大的查詢(xún)(例如,如果你正在處理較大的BLOB列),你可以使用-O max_allowed_packet=#選項(xiàng)(缺省1M)啟動(dòng)mysqld以增加查詢(xún)限制。多余的內(nèi)存按需分配,這樣mysqld只有在你發(fā)出較大差詢(xún)時(shí)或mysqld必須返回較大的結(jié)果行時(shí),才使用更多的內(nèi)存!18.2.2 Cant connect to local MySQL server錯(cuò)誤一個(gè)MySQL客戶(hù)可以?xún)煞N不同的方式連接mysqld服務(wù)器:Unix套接字,它通過(guò)在文件系統(tǒng)中的一個(gè)文件(缺省“/tmp/mysqld.sock”)進(jìn)行連接;或TCP/IP,它通過(guò)一個(gè)端口號(hào)連接。Unix套接字比TCP/IP更快,但是只有用在連接同一臺(tái)計(jì)算機(jī)上的服務(wù)器。如果你不指定主機(jī)名或如果你指定特殊的主機(jī)名localhost,使用Unix套接字。錯(cuò)誤(2002)Cant connect to .通常意味著沒(méi)有一個(gè)MySQL服務(wù)器運(yùn)行在系統(tǒng)上或當(dāng)試圖連接mysqld服務(wù)器時(shí),你正在使用一個(gè)錯(cuò)誤的套接字文件或TCP/IP端口。 由檢查(使用ps)在你的服務(wù)器上有一個(gè)名為mysqld的進(jìn)程啟動(dòng)!如果沒(méi)有任何mysqld過(guò)程,你應(yīng)該啟動(dòng)一個(gè)。見(jiàn)4.15.2 啟動(dòng)MySQL服務(wù)器的問(wèn)題。如果一個(gè)mysqld過(guò)程正在運(yùn)行,你可以通過(guò)嘗試這些不同的連接來(lái)檢查服務(wù)器(當(dāng)然,端口號(hào)和套接字路徑名可能在你的安裝中是不同的):shell mysqladmin versionshell mysqladmin variablesshell mysqladmin -h hostname version variablesshell mysqladmin -h hostname -port=3306 versionshell mysqladmin -h ip for your host versionshell mysqladmin -socket=/tmp/mysql.sock version注意hostname命令使用反引號(hào)“”而非正引號(hào)“”;這些導(dǎo)致hostname輸出(即,當(dāng)前主機(jī)名)被代替進(jìn)mysqladmin命令中。這是可能造成Cant connect to local MySQL server錯(cuò)誤的一些原因: mysqld不在運(yùn)行。 你正在使用MIT-pthreads的一個(gè)系統(tǒng)上運(yùn)行。如果正在運(yùn)行在一個(gè)沒(méi)有原生線(xiàn)程的系統(tǒng)上,mysqld使用 MIT-pthreads 軟件包。見(jiàn)4.2 由MySQL支持的操作系統(tǒng)。然而,MIT-pthreads不支持Unix套接字,因此當(dāng)與服務(wù)器連接時(shí),在這樣一個(gè)系統(tǒng)上,你總是必須明確地指定主機(jī)名。試試使用這個(gè)命令檢查到服務(wù)器的連接: shell mysqladmin -h hostname version 某人刪除了mysqld使用的Unix套接字(缺省“/tmp/mysqld.sock”)。你可能有一個(gè)cron任務(wù)刪除了MySQL套接字(例如,一個(gè)把舊文件從“/tmp”目錄中刪除的任務(wù))。你總是可以運(yùn)行mysqladmin version并且檢查mysqladmin正在試圖使用的套接字確實(shí)存在。在這種情況下,修復(fù)方法是刪除cron任務(wù)而不刪除“mysqld.sock 或?qū)⑻捉幼址旁谄渌胤?。你能用這個(gè)命令在MySQL配置時(shí)指定一個(gè)不同的套接字地點(diǎn): shell ./configure -with-unix-socket-path=/path/to/socket你也可以使用-socket=/path/to/socket選項(xiàng)啟動(dòng)safe_mysqld和在啟動(dòng)你的MySQL客戶(hù)前設(shè)置環(huán)境變量MYSQL_UNIX_PORT為套接字路徑名。你可用-socket=/path/to/socket選項(xiàng)啟動(dòng)mysqld服務(wù)器。如果你改變了服務(wù)器的套接字路徑名,你也必須通知MySQL客戶(hù)關(guān)于新路徑的情況。你可以通過(guò)設(shè)置環(huán)境變量MYSQL_UNIX_PORT為套接字路徑名或由提供套接字路徑名作為客戶(hù)的參數(shù)做到。你可用這個(gè)命令測(cè)試套接字:shell mysqladmin -socket=/path/to/socket version 你正在使用 Linux和線(xiàn)程已經(jīng)死了(核心傾倒了)。在這種情況中,你必須殺死其它mysqld線(xiàn)程(例如在啟動(dòng)一個(gè)新的MySQL服務(wù)器之前,可以用mysql_zap腳本)。見(jiàn)18.1 如果MySQL總是崩潰怎么辦。 如果你得到錯(cuò)誤Cant connect to MySQL server on some_hostname,你可以嘗試下列步驟找出問(wèn)題是什么: 通過(guò)執(zhí)行telnet your-host-name tcp-ip-port-number并且按幾次回車(chē)來(lái)檢查服務(wù)器是否正常運(yùn)行。如果有一個(gè)MySQL運(yùn)行在這個(gè)端口上,你應(yīng)該得到一個(gè)包含正在運(yùn)行的MySQL服務(wù)器的版本號(hào)的應(yīng)答。如果你得到類(lèi)似于telnet: Unable to connect to remote host: Connection refused的一個(gè)錯(cuò)誤,那么沒(méi)有服務(wù)器在使用的端口上運(yùn)行。 嘗試連接本地機(jī)器上的mysqld守護(hù)進(jìn)程,并用mysqladmin variables檢查mysqld被配置使用的TCP/IP端口(變量port)。 檢查你的mysqld服務(wù)器沒(méi)有用-skip-networking選項(xiàng)啟動(dòng)。 18.2.3 Host . is blocked錯(cuò)誤如果你得到象這樣的一個(gè)錯(cuò)誤:Host hostname is blocked because of many connection errors.Unblock with mysqladmin flush-hosts這意味著,mysqld已經(jīng)得到了大量(max_connect_errors)的主機(jī)hostname的在中途被中斷了的連接請(qǐng)求。在max_connect_errors次失敗請(qǐng)求后,mysqld認(rèn)定出錯(cuò)了(象來(lái)字一個(gè)黑客的攻擊),并且阻止該站點(diǎn)進(jìn)一步的連接,直到某人執(zhí)行命令mysqladmin flush-hosts。缺省地,mysqld在10個(gè)連接錯(cuò)誤后阻塞一臺(tái)主機(jī)。你可以通過(guò)象這樣啟動(dòng)服務(wù)器很容易地調(diào)整它:shell safe_mysqld -O max_connect_errors=10000 &注意,對(duì)給定的主機(jī),如果得到這條錯(cuò)誤消息,你應(yīng)該首先檢查該主機(jī)的TCP/IP連接有沒(méi)有問(wèn)題。如果你的TCP/IP連接不在運(yùn)行,增加max_connect_errors變量的值對(duì)你也不會(huì)有幫助!18.2.4 Too many connections錯(cuò)誤如果在你試土連接MySQL時(shí),你得到錯(cuò)誤Too many connections,這意味著已經(jīng)有max_connections個(gè)客戶(hù)連接了mysqld服務(wù)器。如果你需要比缺省(100)更多的連接,那么你應(yīng)該重啟mysqld,用更大的 max_connections 變量值。注意,mysqld實(shí)際上允許(max_connections+1)個(gè)客戶(hù)連接。最后一個(gè)連接是為一個(gè)用Process權(quán)限的用戶(hù)保留的。通過(guò)不把這個(gè)權(quán)限給一般用戶(hù)(他們不應(yīng)該需要它),有這個(gè)權(quán)限一個(gè)管理員可以登錄并且使用SHOW PROCESSLIST找出什么可能出錯(cuò)。見(jiàn)7.21 SHOW句法(得到表,列的信息)。18.2.5 Out of memory錯(cuò)誤如果你發(fā)出查詢(xún)并且得到類(lèi)似于下面的錯(cuò)誤: mysql: Out of memory at line 42, malloc.cmysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)ERROR 2008: MySQL client ran out of memory注意,錯(cuò)誤指向了MySQL客戶(hù)mysql。這個(gè)錯(cuò)誤的原因很簡(jiǎn)單,客戶(hù)沒(méi)有足夠的內(nèi)存存儲(chǔ)全部結(jié)果。為了修正這個(gè)問(wèn)題,首先檢查你的查詢(xún)是否正確。它應(yīng)該返回這么多的行,這合理嗎?如果是這樣,你可以使用mysql -quick,它使用mysql_use_result()檢索結(jié)果集合。這將較少的負(fù)擔(dān)放在了客戶(hù)端(只是服務(wù)器更多)。18.2.6 Packet too large錯(cuò)誤當(dāng)一個(gè)MySQL客戶(hù)或mysqld服務(wù)器得到一個(gè)比max_allowed_packet個(gè)字節(jié)長(zhǎng)的包,它發(fā)出一個(gè)Packet too large錯(cuò)誤并終止連接。如果你正在使用mysql客戶(hù),你可以通過(guò)用mysql -set-variable=max_allowed_packet=8M指定一個(gè)更大的緩沖區(qū)來(lái)啟動(dòng)客戶(hù)程序。如果你正在使用不允許你指定最大包大小的其他客戶(hù)(例如 DBI),你需要在你啟動(dòng)服務(wù)器時(shí)設(shè)置包大小。你可以使用mysqld的命令行選項(xiàng)設(shè)置max_allowed_packet為一個(gè)更大的尺寸。例如,如果你正期望將一個(gè)全長(zhǎng)的BLOB存入一張表中,你將需要用-set-variable=max_allowed_packet=24M選項(xiàng)來(lái)啟動(dòng)服務(wù)器。18.2.7 The table is full錯(cuò)誤這個(gè)錯(cuò)誤發(fā)生在內(nèi)存臨時(shí)表變得比tmp_table_size字節(jié)大時(shí)。為了避免這個(gè)問(wèn)題,你可以使用mysqld的-O tmp_table_size=#選項(xiàng)來(lái)增加臨時(shí)表的大小,或在你發(fā)出有疑問(wèn)的查詢(xún)之前使用SQL選項(xiàng)SQL_BIG_TABLES。見(jiàn)7.25 SET OPTION句法。你也可以使用-big-tables選項(xiàng)啟動(dòng)mysqld。這與為所有查詢(xún)使用SQL_BIG_TABLES完全相同。18.2.8 Commands out of sync in client錯(cuò)誤如果你在你的客戶(hù)代碼中得到Commands out of sync; You cant run this command now,你正在以錯(cuò)誤的次序調(diào)用客戶(hù)函數(shù)!這可能發(fā)生,例如,如果你正在使用mysql_use_result()并且在你已經(jīng)調(diào)用了mysql_free_result()之前試圖執(zhí)行新查詢(xún)。如果你在mysql_use_result()或mysql_store_result()之間試圖執(zhí)行返回?cái)?shù)據(jù)的2個(gè)查詢(xún),它也可能發(fā)生。18.2.9 Ignoring user錯(cuò)誤如果你得到下列錯(cuò)誤: Found wrong password for user: some_usersome_host; Ignoring user 這意味著在mysqld啟動(dòng)時(shí)或在它再次裝載權(quán)限表時(shí),它在user表中找到了一個(gè)有一個(gè)無(wú)效口令的條目。結(jié)果,條目簡(jiǎn)單地被權(quán)限系統(tǒng)忽略。可能導(dǎo)致這個(gè)問(wèn)題的原因和修正: 你可能正在運(yùn)行一個(gè)有一個(gè)老的user表的新版本mysqld。你可以通過(guò)執(zhí)行mysqlshow mysql user看看口令字段是否少于 16個(gè)字符來(lái)檢查它。如果是這樣,你可以通過(guò)運(yùn)行scripts/add_long_password腳本改正這種情況。 用戶(hù)有一個(gè)老式的口令(8個(gè)字符長(zhǎng))并且你沒(méi)使用-old-protocol選項(xiàng)啟動(dòng)mysqld。用一個(gè)新口令更新在user表中的用戶(hù)或用-old-protocol重啟mysqld。 你沒(méi)有使用PASSWORD()函數(shù)在在user表中指定了一個(gè)口令。使用mysql以一個(gè)新口令更新在user表中的用戶(hù)。確保使用PASSWORD()函數(shù): mysql update user set password=PASSWORD(your password) where user=XXX;18.2.10 Table xxx doesnt exist錯(cuò)誤如果你得到錯(cuò)誤Table xxx doesnt exist或Cant find file: xxx (errno: 2),這意味著在當(dāng)前數(shù)據(jù)庫(kù)中沒(méi)有名為xxx的表存在。注意,因?yàn)镸ySQL使用目錄和文件存儲(chǔ)數(shù)據(jù)庫(kù)和表,數(shù)據(jù)庫(kù)和表名件是區(qū)分大小寫(xiě)的?。ㄔ赪in32上,數(shù)據(jù)庫(kù)和表名不是區(qū)分大小寫(xiě)的,但是在查詢(xún)中對(duì)所有表的引用必須使用相同的大小寫(xiě)?。┠憧梢杂肧HOW TABLES檢查你在當(dāng)前數(shù)據(jù)庫(kù)中有哪個(gè)表。見(jiàn)7.21 SHOW句法(得到表、列的信息)。 18.3 MySQL怎樣處理一個(gè)溢出的磁盤(pán)當(dāng)出現(xiàn)一個(gè)磁盤(pán)溢出的情況時(shí),MySQL做下列事情: 它每分鐘檢查一次看是否有足夠空間寫(xiě)入當(dāng)前行。如果有足夠的空間,它繼續(xù)好像發(fā)生什么事情。 每6分鐘它將有關(guān)磁盤(pán)溢出的警告寫(xiě)入日志文件。 為了緩和這個(gè)問(wèn)題,你可以采取下列行動(dòng): 繼續(xù),你只需釋放足夠的空閑磁盤(pán)空間以便插入所有記錄。 放棄線(xiàn)程,你必須發(fā)一個(gè)mysqladmin kill到線(xiàn)程。在下一次檢查磁盤(pán)時(shí),線(xiàn)程將被放棄(在1分鐘內(nèi))。 注意,其他線(xiàn)程可能正在等待引起“磁盤(pán)溢出”條件的表。如果你有幾個(gè)“鎖定的”的線(xiàn)程,殺死正在等待磁盤(pán)溢出條件的那個(gè)線(xiàn)程將允許其他線(xiàn)程繼續(xù)。 18.4 如何從一個(gè)文本文件運(yùn)行SQL命令一般地,mysql客戶(hù)被交互性地使用,象這樣:shell mysql database然而,也可以把你的SQL命令放在一個(gè)文件中并且告訴mysql從該文件讀取其輸入。要想這樣做,創(chuàng)造一個(gè)文本文件“text_file”,它包含你想要執(zhí)行的命令。然后如下那樣調(diào)用mysql:shell mysql database mysql chmod +t /tmp這將保護(hù)你的“/tmp”文件系統(tǒng)使得文件僅能由他們的所有者或超級(jí)用戶(hù)(root)刪除。你能執(zhí)行l(wèi)s -ld /tmp檢查sticky位是否被設(shè)置,如果最后一位許可位是t,該位被設(shè)置了。18.7 Access denied錯(cuò)誤見(jiàn)6.6 權(quán)限系統(tǒng)如何工作。并且特別要看6.13 引起Access denied錯(cuò)誤的原因。 18.8 怎樣作為一個(gè)一般用戶(hù)運(yùn)行MySQLMySQL服務(wù)器mysqld能被任何用戶(hù)啟動(dòng)并運(yùn)行。為了將mysqld改由Unix用戶(hù)user_name來(lái)運(yùn)行,你必須做下列事情: 1. 如果它正在運(yùn)行,停止服務(wù)器(使用mysqladmin shutdown)。 2. 改變數(shù)據(jù)庫(kù)目錄和文件以便user_name有權(quán)限讀和寫(xiě)文件(你可能需要作為Unix的root用戶(hù)才能做到):3. shell chown -R user_name /path/to/mysql/datadir如果在MySQL數(shù)據(jù)目錄中的目錄或文件是符號(hào)鏈接,你也將需要順著那些鏈接并改變他們指向的目錄和文件。chown -R不能跟隨符號(hào)鏈接。4. 以u(píng)ser_name用戶(hù)啟動(dòng)服務(wù)器,或如果你正在使用MySQL 3.22或以后版本,以Unix root用戶(hù)啟動(dòng)mysqld并使用-user=user_name選項(xiàng),mysqld將在接受任何連接之前切換到以Unix user_name用戶(hù)運(yùn)行。 5. 如果在系統(tǒng)被重新啟動(dòng)時(shí),你使用mysql.server腳本啟動(dòng)mysqld,你應(yīng)該編輯mysql.server用su以用戶(hù)user_name運(yùn)行mysqld,或使用-user選項(xiàng)調(diào)用mysqld。(不改變safe_mysqld是必要的。) 現(xiàn)在,你的mysqld進(jìn)程應(yīng)該正在作為Unix用戶(hù)user_name運(yùn)行,并運(yùn)行完好。盡管有一件事情沒(méi)有變化:權(quán)限表的內(nèi)容。缺省 地(就在運(yùn)行了腳本mysql_install_db安裝的權(quán)限表后),MySQL用戶(hù)root是唯一有存取mysql數(shù)據(jù)庫(kù)或創(chuàng)建或拋棄數(shù)據(jù)庫(kù)權(quán)限的用戶(hù)。除非你改變了那些權(quán)限,否則他們?nèi)匀槐3?。?dāng)你作為一個(gè)Unix用戶(hù)而不是root登錄時(shí),這不應(yīng)該阻止你作為MySQL root用戶(hù)來(lái)存取MySQL;只要為客戶(hù)程序指定-u root的選項(xiàng)。注意通過(guò)在命令行上提供-u root,作為root存取MySQL,與作為Unix root用戶(hù)或其他Unix用戶(hù)運(yùn)行MySQL沒(méi)有關(guān)系。MySQL的存取權(quán)限和用戶(hù)名與Unix用戶(hù)名字是完全分開(kāi)的。唯一與Unix用戶(hù)名有關(guān)的是,如果當(dāng)你調(diào)用一個(gè)客戶(hù)程序時(shí),你不提供一個(gè)-u選項(xiàng),客戶(hù)將試圖使用你的Unix登錄名作為你的MySQL用戶(hù)名進(jìn)行連接。如果你的Unix機(jī)器本身不安全,你可能應(yīng)該至少在存取表中為MySQL root用戶(hù)放上一個(gè)口令。否則,在那臺(tái)機(jī)器上有一個(gè)帳號(hào)的任何用戶(hù)能運(yùn)行mysql -u root db_name并且做他喜歡做的任何事情。18.9 怎樣重新設(shè)置一個(gè)忘記的口令如果你忘記了MySQL的root用戶(hù)的口令,你可以用下列過(guò)程恢復(fù)它。 1. 通過(guò)發(fā)送一個(gè)kill(不是kill -9)到mysqld服務(wù)器來(lái)關(guān)閉mysqld服務(wù)器。pid 被保存在一個(gè).pid文件中,通常在MySQL數(shù)據(jù)庫(kù)目錄中:2. kill cat /mysql-data-directory/hostname.pid你必須是一個(gè)UNIX root用戶(hù)或運(yùn)行服務(wù)器的相同用戶(hù)做這個(gè)。3. 使用-skip-grant-tables選項(xiàng)重啟mysqld。 4. 用mysql -h hostname mysql連接mysqld服務(wù)器并且用一條GRANT命令改變口令。見(jiàn)7.26 GRANT和REVOKE句法。你也可以用mysqladmin -h hostname -u user password new password 進(jìn)行。 5. 用mysqladmin -h hostname flush-privileges或用SQL命令FLUSH PRIVILEGES來(lái)裝載權(quán)限表。 18.10 文件許可權(quán)限問(wèn)題如果你有與文件許可有關(guān)的問(wèn)題,例如,如果當(dāng)你創(chuàng)建一張表時(shí),mysql發(fā)出下列錯(cuò)誤消息: ERROR: Cant find file: path/with/filename.frm (Errcode: 13) 那么可能是在mysqld啟動(dòng)時(shí),環(huán)境變量UMASK可能設(shè)置不正確。缺省的umask值是0660。你可以如下啟動(dòng)safe_mysqld改變其行為:shell UMASK=384 # = 600 in octalshell export UMASKshell /path/to/safe_mysqld &18.11 文件沒(méi)找到如果你從MySQL得到ERROR . not found (errno: 23), Cant open file: . (errno: 24)或任何其他有errno 23或errno 24的錯(cuò)誤,它意味著,你沒(méi)有為MySQL分配足夠的文件描述符。你能使用perror實(shí)用程序得到錯(cuò)誤號(hào)含義是什么的描述:shell perror 23File table overflowshell perror 24Too many open files這里的問(wèn)題是mysqld正在試圖同時(shí)保持打開(kāi)太多的文件。你也可以告訴mysqld一次不打開(kāi)那么多的文件,或增加mysqld可得到的文件描述符數(shù)量。為了告訴mysqld一次保持打開(kāi)更少的文件,你可以通過(guò)使用safe_mysqld的-O table_cache=32選項(xiàng)(缺省值是64)使表緩沖更小。減小max_connections值也將減少打開(kāi)文件的數(shù)量(缺省值是90)。要想改變mysqld可用的文件描述符數(shù)量,修改safe_mysqld腳本。腳本中有一條注釋了的行ulimit -n 256。你可以刪除#字符來(lái)去掉該行的注釋?zhuān)⑶腋淖償?shù)字256改變?yōu)閙ysqld可用的文件描述符的數(shù)量。ulimit能增加文件描述符的數(shù)量,但是只能到操作系統(tǒng)強(qiáng)加的限制。如果你需要增加每個(gè)進(jìn)程可用的文件描述符數(shù)量的OS限制,參見(jiàn)你的操作系統(tǒng)文檔。注意,如果你運(yùn)行tcsh外殼,ulimit將不工作!當(dāng)你請(qǐng)求當(dāng)前限制時(shí),tcsh也將報(bào)告不正確的值!在這種情況下,你應(yīng)該用sh啟動(dòng)safe_mysqld!18.12 使用DATE列的問(wèn)題一個(gè)DATE值的格式是YYYY-MM-DD。根據(jù)ANSI SQL,不允許其他格式。你應(yīng)該在UPDATE表達(dá)式和SELECT語(yǔ)句的WHERE子句中使用這個(gè)格式。例如:mysql SELECT * FROM tbl_name WHERE date = 1997-05-05;為了方便,如果日期用在數(shù)字上下文,MySQL自動(dòng)變換一個(gè)日期到一個(gè)數(shù)字(并且反過(guò)來(lái)也如此)。當(dāng)更新時(shí)和將一個(gè)日期與TIMESTAMP、DATE或DATETIME列比較的一個(gè)WHERE子句中,也是足夠靈活以允許一種“寬松”的字符串格式。(寬松格式意味著任何標(biāo)點(diǎn)字符用作在部件之間的分割符。例如,1998-08-15和1998#08#15是等價(jià)的。)MySQL也能變換不包含分割符的一個(gè)字符串(例如 19980815),如果它作為一個(gè)日期說(shuō)得通。特殊日期0000-00-00可以作為0000-00-00被存儲(chǔ)和檢索。當(dāng)通過(guò)MyODBC使用一個(gè)0000-00-00日期時(shí),在MyODBC 2.50.12和以上版本,它將自動(dòng)被轉(zhuǎn)換為NULL,因?yàn)镺DBC不能處理這種日期。因?yàn)镸ySQL實(shí)行了上述的變換,下列語(yǔ)句可以工作:mysql INSERT INTO tbl_name (idate) VALUES (19970505);mysql INSERT INTO tbl_name (idate) VALUES (19970505);mysql INSERT INTO tbl_name (idate) VALUES (97-05-05);mysql INSERT INTO tbl_name (idate) VALUES (1997.05.05);mysql INSERT INTO tbl_name (idate) VALUES (1997 05 05);mysql INSERT INTO tbl_name (idate) VALUES (0000-00-00);mysql SELECT idate FROM tbl_name WHERE idate = 1997-05-05;mysql SELECT idate FROM tbl_name WHERE idate = 19970505;mysql SELECT mod(idate,100) FROM tbl_name WHERE idate = 19970505;mysql SELECT idate FROM tbl_name WHERE idate = 19970505;然而,下列將不工作: mysql SELECT idate FROM tbl_name WHERE STRCMP(idate,19970505)=0;STRCMP()是字符串函數(shù),因此它將idate轉(zhuǎn)換為一個(gè)字符串并且實(shí)施字符串比較。它不將19970505轉(zhuǎn)換為一個(gè)日期并實(shí)施日期比較。注意,MySQL不檢查日期是否正確。如果你存儲(chǔ)一個(gè)不正確的日期,例如1998-2-31,錯(cuò)誤的日期將被存儲(chǔ)。如果日期不能被變換到任何合理的值,在DATE字段中存儲(chǔ)一個(gè)0。這主要是一個(gè)速度問(wèn)題并且我們認(rèn)為檢查日期是應(yīng)用程序的責(zé)任,而不服務(wù)器。18.13 時(shí)區(qū)問(wèn)題如果你有一個(gè)問(wèn)題,SELECT NOW()以GMT時(shí)間返回值而不是你的本地時(shí)間,你必須設(shè)定TZ環(huán)境變量為你的當(dāng)前時(shí)區(qū)。這應(yīng)該在服務(wù)器運(yùn)行的環(huán)境進(jìn)行,例如在safe_mysqld或mysql.server中。18.14 在搜索中的大小寫(xiě)敏感性缺省地,MySQL搜索是大小寫(xiě)不敏感的(盡管有一些字符集從來(lái)不是忽略大小寫(xiě)的,例如捷克語(yǔ))。這意味著,如果你用col_name LIKE a%搜尋,你將得到所有以A或a開(kāi)始的列值。如果你想要使這個(gè)搜索大小寫(xiě)敏感,使用象INDEX(col_name, A)=0檢查一個(gè)前綴?;蛉绻兄当仨毚_切是A,使用STRCMP(col_name, A) = 0。簡(jiǎn)單的比較操作(=、= 、 、=、排序和聚合)是基于每個(gè)字符的“排序值”。有同樣排序值的字符(象E,e和e)被視為相同的字符!LIKE比較在每個(gè)字符的大寫(xiě)值上進(jìn)行(E=e 但是Ee)。如果你想要一個(gè)列總是被當(dāng)作大小寫(xiě)敏感的方式,聲明它為BINARY。見(jiàn)7.7 CREATE TABLE句法。如果你使用以所謂的big5編碼的中文數(shù)據(jù),你要使所有的字符列是BINARY,它可行,是因?yàn)閎ig5編碼字符的排序順序基于 ASCII代碼的順序。18.15 NULL值問(wèn)題NULL值的概念是造成SQL的新手的混淆的普遍原因,他們經(jīng)常認(rèn)為NULL是和一個(gè)空字符串的一樣的東西。不是這樣的!例如,下列語(yǔ)句是完全不同的:mysql INSERT INTO my_table (phone) VALUES (NULL);mysql INSERT INTO my_table (phone) VALUES ();兩個(gè)語(yǔ)句把值插入到phone列,但是第一個(gè)插入一個(gè)NULL值而第二個(gè)插入一個(gè)空字符串。第一個(gè)的含義可以認(rèn)為是“電話(huà)號(hào)碼不知道”,而第二個(gè)則可意味著“她沒(méi)有電話(huà)”。 在SQL中,NULL值在于任何其他值甚至NULL值比較時(shí)總是假的(FALSE)。包含NULL的一個(gè)表達(dá)式總是產(chǎn)生一個(gè)NULL值,除非在包含在表達(dá)式中的運(yùn)算符和函數(shù)的文檔中指出。在下列例子,所有的列返回NULL:mysql SELECT NULL,1+NULL,CONCAT(Invisible,NULL);如果你想要尋找值是NULL的列,你不能使用=NULL測(cè)試。下列語(yǔ)句不返回任何行,因?yàn)閷?duì)任何表達(dá)式,expr = NULL是假的:mysql SELECT * FROM my_table WHERE phone = NULL;要想尋找NULL值,你必須使用IS NULL測(cè)試。下例顯示如何找出NULL電話(huà)號(hào)碼和空的電話(huà)號(hào)碼:mysql SELECT * FROM my_table WHERE phone IS NULL;mysql SELECT * FROM my_table WHERE phone = ;在MySQL中,就像很多其他的SQL服務(wù)器一樣,你不能索引可以有NULL值的列。你必須聲明這樣的列為NOT NULL,而且,你不能插入NULL到索引的列中。當(dāng)用LOAD DATA INFILE讀取數(shù)據(jù)時(shí),空列用更新。如果你想要在一個(gè)列中有NULL值,你應(yīng)該在文本文件中使用N。字面上的詞NULL也可以在某些情形下使用。見(jiàn)7.16 LOAD DATA INFILE句法。當(dāng)使用ORDER BY時(shí),首先呈現(xiàn)NULL值。如果你用DESC以降序排序,NULL值最后顯示。當(dāng)使用GROUP BY時(shí),所有的NULL值被認(rèn)為是相等的。為了有助于NULL的處理,你能使用IS NULL和IS NOT NULL運(yùn)算符和IFNULL()函數(shù)。對(duì)某些列類(lèi)型,NULL值被特殊地處理。如果你將NULL插入表的第一個(gè)TIMESTAMP列,則插入當(dāng)前的日期和時(shí)間。如果你將NULL插入一個(gè)AUTO_INCREMENT列,則插入順序中的下一個(gè)數(shù)字。18.16 alias問(wèn)題你可以在GROUP BY、ORDER BY或在HAVING部分中使用別名引用列。別名也可以用來(lái)為列取一個(gè)更好點(diǎn)的名字:SELECT SQRT(a*b) as rt FROM table_name GROUP BY rt HAVING rt 0;SELECT id,COUNT(*) AS cnt FROM table_name GROUP BY id HAVING cnt 0;SELECT id AS Customer identity FROM table_name;注意,你的 ANSI SQL 不允許你在一個(gè)WHERE子句中引用一個(gè)別名。這是因?yàn)樵赪HERE代碼被執(zhí)行時(shí),列值還可能沒(méi)有終結(jié)。例如下列查詢(xún)是不合法:SELECT id,COUNT(*) AS cnt FROM table_name WHERE cnt 0 GROUP BY id;WHERE語(yǔ)句被執(zhí)行以確定哪些行應(yīng)該包括GROUP BY部分中,而HAVING用來(lái)決定應(yīng)該只用結(jié)果集合中的哪些行。 18.17 從關(guān)聯(lián)的表中刪除行因?yàn)镸ySQL不支持子選擇或在DELETE語(yǔ)句中使用多個(gè)表,你應(yīng)該使用下列方法從2個(gè)關(guān)聯(lián)的表中刪除行: 1. 在主表中基于某個(gè)WHERE條件SELECT行。 2. 在主表中基于相同的條件DELETE行。 3. DELETE FROM related_table WHERE related_column IN (selected_rows) 如果在related_column查詢(xún)中的字符的全部數(shù)量超過(guò)1,048,576(缺省值max_allowed_packet),你應(yīng)該分成更小的部分并且執(zhí)行多個(gè)DELETE語(yǔ)句。如果related_column是一個(gè)索引,你每次只刪除100-1000個(gè)related_column id將可能使得DELETE最快。如果related_column不是一個(gè)索引,速度與IN子句中參數(shù)的數(shù)量無(wú)關(guān)。18.18 解決沒(méi)有匹配行的問(wèn)題如果你有一個(gè)復(fù)雜的查詢(xún),涉及多個(gè)表,但沒(méi)有返回任何行,你應(yīng)該使用下列過(guò)程查找你的詢(xún)問(wèn)有什么不對(duì): 1. EXPLAIN測(cè)試查詢(xún)并且檢查你是否能找出顯然是錯(cuò)誤的一些東西。見(jiàn)7.22 EXPLAIN句法(得到關(guān)于一個(gè)SELECT的信息)。 2. 僅選擇那些在WHERE子句中使用的字段。 3. 一次從查詢(xún)中刪除一個(gè)表,直到它返回一些行。如果表很大,對(duì)查詢(xún)使用LIMIT 10是一個(gè)好主意。 4. 對(duì)應(yīng)該已經(jīng)匹配一行的列做一個(gè)SELECT,針對(duì)從詢(xún)問(wèn)中做后被刪除

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論