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

下載本文檔

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

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論