久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換

瀏覽:2日期:2023-11-30 18:34:28

; 2.4 表達(dá)式求值和類型轉(zhuǎn)換 ; MySQL允許編寫包括常量、函數(shù)調(diào)用和表列引用的表達(dá)式。這些值可利用不同類型的運(yùn)算符進(jìn)行組合,諸如算術(shù)運(yùn)算符或比較運(yùn)算符。表達(dá)式的項(xiàng)可用圓括號(hào)來分組。表達(dá)式在SELECT 語句的列選擇列表和WHERE 子句中出現(xiàn)得最為頻繁,如下所示:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 所選擇的每列給出了一個(gè)表達(dá)式,如WHERE 子句中所示的那樣。表達(dá)式也出現(xiàn)在DELETE 和UPDATE語句的WHERE 子句中,以及出現(xiàn)在INSERT 語句的VALUES( ) 子句中。 ; 在MySQL遇到一個(gè)表達(dá)式時(shí),它對(duì)其求值得出結(jié)果。例如, (4 * 3)/(4 - 2) 求值得6。表達(dá)式求值可能涉及類型轉(zhuǎn)換。例如, MySQL在數(shù)960821用于需要日期值的環(huán)境時(shí),將其轉(zhuǎn)換為日期“ 19 9 6 - 0 8 - 2 1”。本節(jié)討論怎樣編寫MySQL的表達(dá)式,以及在表達(dá)式求值中MySQL所使用的類型轉(zhuǎn)換規(guī)則。每個(gè)MySQL的運(yùn)算符都介紹過了,但MySQL有那么多的函數(shù),我們只接觸過幾個(gè)。每個(gè)運(yùn)算符和函數(shù)的進(jìn)一步介紹可參閱附錄C。 ; 2.4.1撰寫表達(dá)式 ; 表達(dá)式可以只是一個(gè)簡(jiǎn)單的常量,如: ; 0 數(shù)值常量 ; “a b c” 串常量 ; 表達(dá)式可以進(jìn)行函數(shù)調(diào)用。有的函數(shù)需要參數(shù)(圓括號(hào)中有值),而有的不需要。多個(gè)參數(shù)應(yīng)該用逗號(hào)分隔。在調(diào)用一個(gè)函數(shù)時(shí),參數(shù)旁邊可以有空格,但在函數(shù)名與圓括號(hào)間不能有空格。下面是一些函數(shù)例子:NOW( ) 無參數(shù)函數(shù) ; STRCMP (“a b c”, “d e f”) 有兩個(gè)參數(shù)的函數(shù) ; STRCMP( “a b c”, “d e f”) 參數(shù)旁邊有空格是合法的 ; STRCMP (“a b c”, “d e f”) 函數(shù)名后跟空格是不合法的 ; 如果函數(shù)名后有一個(gè)空格, MySQL的分析程序可能會(huì)將函數(shù)名解釋為一個(gè)列名(函數(shù)名不是保留字,如果需要的話,可將它們用作列名)。其結(jié)果是出現(xiàn)一個(gè)語法錯(cuò)誤。表達(dá)式中可使用表列。最簡(jiǎn)單的情形是,當(dāng)某個(gè)列所屬的表在上下文中是明確的,則可簡(jiǎn)單地給出列名對(duì)該列進(jìn)行引用。下面的每個(gè)SELECT 語句中惟一地出了一個(gè)表名,因此,列的引用無歧義:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 如果使用哪個(gè)表的列不明確,可在列名前加上表名。如果使用哪個(gè)數(shù)據(jù)庫中的表也不明確的話,可在表名前加上數(shù)據(jù)庫名。如果只是希望意思更明顯,也可以在無歧義的上下文中利用這種更為具體的表示形式,如:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 總之,可以組合所有這些值以得到更為復(fù)雜的表達(dá)式。 ; 1. 運(yùn)算符的類型 ; MySQL有幾種類型的運(yùn)算符,可用來連接表達(dá)式的項(xiàng)。算術(shù)運(yùn)算符,如表2-15 所示,一般包括加、減、乘、除以及模運(yùn)算符。在兩個(gè)操作數(shù)都是整數(shù)時(shí),“+”、“-”和“ *”算術(shù)運(yùn)算用BIGINT(64 位)整數(shù)值來完成。而在結(jié)果預(yù)期為一個(gè)整數(shù)時(shí),“/”和“%”也是用BIGINT(64 位)整數(shù)值來完成的。應(yīng)該認(rèn)識(shí)到,如果某個(gè)運(yùn)算涉及更大的值,如結(jié)果超過64 位,其結(jié)果不可預(yù)料。Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 邏輯運(yùn)算符如表2 - 16所示,對(duì)表達(dá)式進(jìn)行估計(jì)以確定其為真(非零)或假(零)。MySQL包含有C 風(fēng)格的“& &”、“| |”和“!”運(yùn)算符,可替換A N D、OR 和N O T。要特別注意“| |”運(yùn)算符,ANSI SQL 指定“| |”作為串連接符,但在MySQL中,它表示一個(gè)邏輯或運(yùn)算。如果執(zhí)行下面的查詢,則返回?cái)?shù)0:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 MySQL為進(jìn)行運(yùn)算,將“ a b c”和“d e f”轉(zhuǎn)換為整數(shù),且兩者都轉(zhuǎn)換為0, 0與0進(jìn)行或運(yùn)算,結(jié)果為0。在MySQL中,必須用CONCAT (“a b c”, “d e f”) 來完成串的連接。Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 位運(yùn)算符如表2-17 所示,完成按位“與”和“或”,其中結(jié)果的每一位按兩個(gè)操作數(shù)的對(duì)應(yīng)位的邏輯AND 或OR 求值。還可以進(jìn)行位的左移或右移。位運(yùn)算用BIGINT(64 位)整數(shù)值進(jìn)行。Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 比較運(yùn)算符如表2-18 所示,其中包括測(cè)試相對(duì)大小或數(shù)和串的順序的運(yùn)算符,以及完成模式匹配和測(cè)試NULL 值的運(yùn)算符。“< = >”運(yùn)算符是MySQL特有的,在MySQL3.23版本中引入。Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 自MySQL3.23版本起,可使用B I N A RY 運(yùn)行符,此運(yùn)算符可用來將一個(gè)串轉(zhuǎn)換為一個(gè)二進(jìn)制串,這個(gè)串在比較中是區(qū)分大小寫的。下列的第一個(gè)比較是不區(qū)分大小寫的,但第二個(gè)和第三個(gè)比較是區(qū)分大小寫的:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 沒有相應(yīng)的NOT BINARY 計(jì)算。如果希望使一個(gè)列既能在區(qū)分大小寫又能在不區(qū)分大小寫的環(huán)境中使用,則應(yīng)該利用不區(qū)分大小寫的列并對(duì)希望區(qū)分大小寫的比較使用BINARY。對(duì)于利用二進(jìn)制串類型(CHAR BINARY、VARCHAR BINARY 和BLOB 類型)定義的列,其比較總是區(qū)分大小寫的。為了對(duì)這樣的列類型實(shí)現(xiàn)不區(qū)分大小寫的比較,可利用UPPER( ) 或LOWER( ) 來轉(zhuǎn)換成相同的大小寫:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 對(duì)于不區(qū)分大小寫的串比較,有可能把多個(gè)字符認(rèn)為是相等的,這取決于所用的字符集。例如“e”和“é”對(duì)于比較和排序操作可能是相同的。二進(jìn)制(區(qū)分大小寫)比較利用字符的ASCII 值來完成。 ; 模式匹配允許查找值而不必給出精確的直接值。MySQL利用LIKE 運(yùn)算符和通配符“%”(匹配任意的字符序列)和“ _”(匹配任意單個(gè)字符),提供SQL 的模式匹配。MySQL還基于類似于諸如g r e p、sed 和vi 等UNIX 程序中所用的REGEXP 運(yùn)算符和擴(kuò)展正規(guī)表達(dá)式,提供模式匹配。為了完成模式匹配,必須使用這些模式匹配運(yùn)算符中的某一個(gè);不能使用“ =”。為了進(jìn)行相反的模式匹配,可使用NOT LIKE 或NOT REGEXP。 ; 除了使用的模式運(yùn)算符和模式字符不同外,這兩種模式匹配還在以下重要的方面存在差異: ; ■ 除非至少有一個(gè)操作數(shù)為二進(jìn)制串,否則LIKE 是不區(qū)分大小寫的。REGEXP 是區(qū)分大小寫的。(在MySQL3.23.4 以后的版本中,除非至少有一個(gè)操作數(shù)是二進(jìn)制串,否則REGEXP 是不區(qū)分大小寫的。) ; ■ 僅當(dāng)整個(gè)串匹配,SQL 才是模式匹配的。僅當(dāng)相應(yīng)的模式在串中某一處出現(xiàn),正規(guī)表達(dá)式才匹配。用于LIKE 運(yùn)算符的模式可以包括“%”和“_”通配符。例如,模式“ F r a n k %”與任何以“F r a n k”起頭的串匹配:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 通配符“%”與任何串匹配,其中包括與空字符序列匹配,因此“ Frank %”與“ Frank”匹配:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 這也表示模式“%”與任何串匹配,其中包括與空串匹配。但是,“%”不與NULL 匹配。事實(shí)上,具有NULL 操作數(shù)的任何模式匹配都將失敗:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 MySQL的LIKE 運(yùn)算符是不區(qū)分大小寫的,除非它至少有一個(gè)操作數(shù)是二進(jìn)制串。因此,缺省時(shí)“ Frank %”與串“ Frankly”和“frankly”匹配,但在二進(jìn)制比較中,它只與其中之一匹配:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 這不同于ANSI SQL 的LIKE 運(yùn)算符,它是區(qū)分大小寫的。通配符可在模式中任何地方給出。“% bert”與“ Englebert”、“Bert”和“Albert”匹配。“% bert %”也與所有這些串匹配,而且還與如像“ Berthold”、“Bertram”、和“Alberta”這樣的串匹配。LIKE 所允許的另一個(gè)通配符是“ _”,它與單個(gè)字符匹配。“_ _”與三個(gè)字符的串匹配。“c _ t”與“c a t”、“c ut”甚至“c _ t”匹配(因?yàn)椤癬”與自身匹配)。為了關(guān)掉“%”或“ _”的特殊含義,與這些字符的直接實(shí)例相匹配,需要在它們前面放置一個(gè)斜杠(“ %”或“ _”),如: Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 MySQL的另一種形式的模式匹配使用了正規(guī)表達(dá)式。運(yùn)算符為REGEXP 而不是L I K E(RLIKE 為REGEXP 的同義詞)。最常用的正規(guī)表達(dá)式模式字符如下:‘.’與任意單個(gè)字符匹配:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 ‘[ . . . ]’與方括號(hào)中任意字符匹配。可列出由短劃線‘ -’分隔的范圍端點(diǎn)指定一個(gè)字符范圍。為了否定這種區(qū)間的意義(即與未列出的任何字符匹配),指定‘ ^’作為該區(qū)間的第一個(gè)字符即可:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 ‘*’表示“與其前面字符的任意數(shù)目的字符匹配”,因此,如‘ x *’與任意數(shù)目的‘ x’字符匹配,例如:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 “任意數(shù)目”包括0個(gè)實(shí)例,這也就是為什么第二個(gè)表達(dá)式匹配成功的原因。‘^pat’和‘pat$’固定了一種模式匹配,從而模式pat 只在它出現(xiàn)在串的前頭時(shí)匹配,而‘ ^pat$’只在pat 匹配整個(gè)串時(shí)匹配,例如:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 REGEXP 模式可從某個(gè)表列中取出,雖然如果該列包含幾個(gè)不同的值時(shí),這樣做比常量模式慢。每當(dāng)列值更改時(shí),必須對(duì)模式進(jìn)行檢查并轉(zhuǎn)換成內(nèi)部形式。MySQL的正規(guī)表達(dá)式匹配還有一些特殊的模式字符。要了解更詳細(xì)信息請(qǐng)參閱附錄C。 ; 2. 運(yùn)算符的優(yōu)先級(jí) ; 當(dāng)求一個(gè)表達(dá)式的值時(shí),首先查看運(yùn)算符以決定運(yùn)算的先后次序。有的運(yùn)算符具有較高的優(yōu)先級(jí);例如,乘和除比加和減的優(yōu)先級(jí)更高。下面的兩個(gè)表達(dá)式是等價(jià)的,因?yàn)椤?*”和“/”先于“+”和“-”計(jì)算:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 下面列出了運(yùn)算符的優(yōu)先級(jí),從高到低。列在同一行中的運(yùn)算符具有相同的優(yōu)先級(jí)。優(yōu)先級(jí)較高的運(yùn)算符在優(yōu)先級(jí)較低的運(yùn)算符之前求值。Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 可用圓括號(hào)來忽略運(yùn)算符的優(yōu)先級(jí)并改變表達(dá)式的求值順序,如:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 3. 表達(dá)式中的NULL 值 ; 請(qǐng)注意,在表達(dá)式中使用NULL 值時(shí),其結(jié)果有可能出現(xiàn)意外。下列準(zhǔn)則將有助于避免出問題。如果將NULL 作為算術(shù)運(yùn)算或位運(yùn)算符的一個(gè)操作數(shù),其結(jié)果為NULL:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 如果將NULL 用于邏輯運(yùn)算符,NULL 被認(rèn)為是假:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 NULL 作為任意比較運(yùn)算符的操作數(shù),除< = >、IS NULL 和IS NOT NULL 運(yùn)算符(它們是專門擴(kuò)展來處理NULL 值的)外,將產(chǎn)生一個(gè)NULL 結(jié)果。如:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 如果給函數(shù)一個(gè)NULL 參數(shù),除了那些處理NULL 參數(shù)的函數(shù)外,一般返回一個(gè)NULL結(jié)果。例如,IFNULL( ) 能夠處理NULL 參數(shù)并適當(dāng)?shù)胤祷卣婊蚣佟TRCMP( ) 期望一個(gè)非NULL 的參數(shù);如果它發(fā)現(xiàn)傳給它的是一個(gè)NULL 參數(shù),則返回NULL 而不是真或假。在排序操作中,NULL 值被歸到一起。在升序排序中, NULL 將排在所有非NULL 值之前(包括空串),而在降序排序中,NULL 將排在所有非NULL 值之后。 ; 2.4.2 類型轉(zhuǎn)換 ; MySQL根據(jù)所執(zhí)行的操作類型,自動(dòng)地進(jìn)行大量的類型轉(zhuǎn)換,任何時(shí)候,只要將一個(gè)類型的值用于需要另一類型值的場(chǎng)合,就會(huì)進(jìn)行這種轉(zhuǎn)換。下面是需要進(jìn)行類型轉(zhuǎn)換的原因: ; ■ 操作數(shù)轉(zhuǎn)換為適合于某種運(yùn)算符求值的類型。 ; ■ 函數(shù)參數(shù)轉(zhuǎn)換為函數(shù)所需的類型。 ; ■ 轉(zhuǎn)換某個(gè)值以便賦給一個(gè)具有不同類型的表列。下列表達(dá)式涉及類型轉(zhuǎn)換。它由加運(yùn)算符“ +”和兩個(gè)操作數(shù)1和“2” 組成: ; 1+'2' ; 其中操作數(shù)的類型不同,一個(gè)是數(shù),另一個(gè)是串,因此, MySQL對(duì)其中之一進(jìn)行轉(zhuǎn)換以便使它們兩個(gè)具有相同的類型。但是應(yīng)該轉(zhuǎn)換哪一個(gè)呢?因?yàn)椋?”是一個(gè)數(shù)值運(yùn)算符,所以MySQL希望操作數(shù)為數(shù),因此,將串“ 2”轉(zhuǎn)換為數(shù)2。然后求此表達(dá)式的值得出3。再舉一例。C O N C AT( ) 函數(shù)連接串產(chǎn)生一個(gè)更長的串作為結(jié)果。為了完成此工作,它將參數(shù)解釋為串,而不管參數(shù)實(shí)際是何類型。如果傳遞給C O N C AT( ) 幾個(gè)數(shù),則它將把它們轉(zhuǎn)換成串,然后返回這些串的連接,如:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 如果作為表達(dá)式的組成部分調(diào)用C O N C AT( ),可能會(huì)進(jìn)行進(jìn)一步的類型轉(zhuǎn)換。考察下列表達(dá)式及其結(jié)果:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 CONCAT(1, 2, 3) 產(chǎn)生串“12 3”。表達(dá)式“12 3”/10 轉(zhuǎn)換為12 3 / 10,因?yàn)槌且粋€(gè)算術(shù)運(yùn)算符。這個(gè)表達(dá)式的結(jié)果的浮點(diǎn)形式為12 . 3,但REPEAT( ) 需要整數(shù)的重復(fù)計(jì)數(shù)值,所以進(jìn)行整除得12。然后,REPEAT (‘X’, 12) 產(chǎn)生一個(gè)含有12個(gè)‘X’ 字符的結(jié)果串。一般原則是,MySQL盡量將值轉(zhuǎn)換為表達(dá)式所需要的類型,盡量避免由于值的類型不對(duì)而導(dǎo)致錯(cuò)誤。根據(jù)上下文, MySQL將在三種通用類型(數(shù)、串或日期與時(shí)間)之間進(jìn)行值的轉(zhuǎn)換。但是,值不能總是可以從一種類型轉(zhuǎn)為另一種類型。如果被轉(zhuǎn)換值不是給定類型的合法值,則此轉(zhuǎn)換失敗。將如“a b c” 這樣不像數(shù)的東西轉(zhuǎn)換為數(shù),則結(jié)果為0。將不像日期或時(shí)間的東西轉(zhuǎn)換為日期或時(shí)間類型結(jié)果為該類型的“零”值。例如,將串“a b c” 轉(zhuǎn)換為日期結(jié)果為“零”日期“ 0 0 0 0 - 0 0 - 0 0”。而任何值都可以處理為串,因此,一般將某個(gè)值轉(zhuǎn)換為串不會(huì)產(chǎn)生問題。 ; MySQL也進(jìn)行一些微小的類型轉(zhuǎn)換。如果在整型環(huán)境中使用一個(gè)浮點(diǎn)值,此值將被轉(zhuǎn)換,轉(zhuǎn)換時(shí)進(jìn)行四舍五入。也可以進(jìn)行相反的工作;一個(gè)整數(shù)用作浮點(diǎn)數(shù)也不會(huì)有問題。除非其內(nèi)容顯示表示一個(gè)數(shù),否則十六進(jìn)制常數(shù)一般作為串處理。在串上下文中,每對(duì)十六進(jìn)制數(shù)字轉(zhuǎn)換為一個(gè)字符,其結(jié)果作為串。下面是一些轉(zhuǎn)換的樣例:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 相同的解釋原理也應(yīng)用到比較上;除非與其比較的是一個(gè)數(shù),否則十六進(jìn)制常量按串對(duì)待,例如:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 某些運(yùn)算符可將操作數(shù)強(qiáng)制轉(zhuǎn)換為它們所要的類型,而不管操作數(shù)是什么類型。例如,算術(shù)運(yùn)算符需要數(shù),并按此對(duì)操作數(shù)進(jìn)行轉(zhuǎn)換,參考如下運(yùn)算:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 MySQL不對(duì)整個(gè)串進(jìn)行尋找一個(gè)數(shù)的查找;它只查看串的起始處。如果一個(gè)串不以數(shù)作為前導(dǎo)部分,其轉(zhuǎn)換結(jié)果為0。Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 請(qǐng)注意,MySQL的串到數(shù)的轉(zhuǎn)換規(guī)則自3 . 2 3版以后已經(jīng)改變了。在該版本以前,類似于數(shù)的串被轉(zhuǎn)換為四舍五入的整數(shù)值。自3.23 版后,它們轉(zhuǎn)換為浮點(diǎn)值,例如:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 邏輯和位運(yùn)算符比算術(shù)運(yùn)算符要求更為嚴(yán)格。它們不僅希望操作數(shù)為數(shù),而且還要求是整數(shù)。這表示一個(gè)浮點(diǎn)數(shù),如. 3,不被視為真,雖然它是非零的;這是因?yàn)樵谵D(zhuǎn)換為整數(shù)時(shí),. 3已經(jīng)轉(zhuǎn)換為0了。在下面的表達(dá)式中,除非各操作數(shù)有一個(gè)至少為1的值,否則各操作數(shù)不被認(rèn)為是真。Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 這種轉(zhuǎn)換也出現(xiàn)在IF( ) 函數(shù)中,此函數(shù)要求第一個(gè)參數(shù)為整數(shù)。為了恰當(dāng)?shù)貙?duì)浮點(diǎn)值進(jìn)行測(cè)試,最好是利用明確的比較。否則,小于1的值將被認(rèn)為是假,例如:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 模式匹配運(yùn)算符要求對(duì)串進(jìn)行處理。這表示可將MySQL的模式匹配運(yùn)算符用于數(shù),因?yàn)镸ySQL會(huì)在試圖進(jìn)行的匹配中將它們轉(zhuǎn)換成串。例如:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 大小比較運(yùn)算符(“<”、“< =”、“=”等等)是上下文相關(guān)的;即,它們根據(jù)操作數(shù)的類型求值。下面的表達(dá)式從數(shù)值上對(duì)操作數(shù)進(jìn)行比較,因?yàn)椴僮鞣麅蛇叾际菙?shù)。

2 < 11-> 1; ; ; 下面的表達(dá)式涉及串比較,因?yàn)槠鋬蛇叺牟僮鲾?shù)都是串: '2' < '11' -> 0 ; 在下面的比較中,類型是混合的,因此,MySQL按數(shù)比較它們。結(jié)果是兩個(gè)表達(dá)式都為真:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 在各個(gè)比較中,MySQL根據(jù)下列規(guī)則對(duì)操作數(shù)進(jìn)行轉(zhuǎn)換: ; ■ 除了“< = >”運(yùn)算符外,涉及NULL 值的比較其值為NULL(除NULL <=> NULL 為真外,“< = >”與“=”相同)。 ; ■ 如果兩個(gè)操作數(shù)都是串,則按串進(jìn)行字典順序的比較。串比較利用服務(wù)器上有效的字符集進(jìn)行。 ; ■ 如果兩個(gè)操作數(shù)都為整數(shù),則按整數(shù)進(jìn)行數(shù)的比較。 ; ■ 不與數(shù)進(jìn)行比較的十六進(jìn)制常量按二進(jìn)制串進(jìn)行比較。 ; ■ 如果其中有一個(gè)操作數(shù)為TIMES TAMP 或DATETIME 值而另一個(gè)為常量,則按TIMES TAMP 值進(jìn)行比較。這樣做將使比較對(duì)ODBC 應(yīng)用更好。 ; ■ 否則,兩個(gè)操作數(shù)將按浮點(diǎn)值進(jìn)行數(shù)的比較。注意,這包括一個(gè)串與一個(gè)數(shù)進(jìn)行比較的情況。其中串被轉(zhuǎn)換為數(shù),如果該串轉(zhuǎn)換后不是一個(gè)數(shù),則結(jié)果為0。例如,”14 . 3”轉(zhuǎn)換為14 . 3,但“L 4 . 3” 轉(zhuǎn)換為0。 ; 1. 日期與時(shí)間的解釋規(guī)則 ; MySQL按表達(dá)式的環(huán)境將串和數(shù)自由地轉(zhuǎn)換為日期和時(shí)間值,反之亦然。日期和時(shí)間值在數(shù)值上下文中轉(zhuǎn)換為數(shù);數(shù)在日期或時(shí)間上下文中轉(zhuǎn)換為日期或時(shí)間。在將一個(gè)值賦予一個(gè)日期或時(shí)間列時(shí),或在函數(shù)需要一個(gè)日期或時(shí)間值時(shí),進(jìn)行轉(zhuǎn)換為日期或時(shí)間值的轉(zhuǎn)換。如果表my_table 含有一個(gè)DATE 列date _ col,下列語句是等價(jià)的:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 TO _ DAYS( ) 函數(shù)的參數(shù)在下面三個(gè)表達(dá)中為相同的值:Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 2. 測(cè)試并強(qiáng)制進(jìn)行類型轉(zhuǎn)換 ; 為了了解表達(dá)式中類型轉(zhuǎn)換是怎樣進(jìn)行的,用mysql程序發(fā)布一條對(duì)表達(dá)式求值的SELECT 語句如下: Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 正如您所想像的那樣,筆者在撰寫本章時(shí),做了不少這種比較。測(cè)試表達(dá)式的求值對(duì)于諸如DELETE 或UPDATE這種修改記錄的語句極為重要,因?yàn)樾枰WC只涉及所需涉及的行。檢查表達(dá)式的一個(gè)辦法是,預(yù)先執(zhí)行一條具有準(zhǔn)備用于DELETE 或UPDATE語句的相同WHERE 子句,以驗(yàn)證該子句選擇的行是正確的。假如表my_table 具有一個(gè)含有下列值的CHAR 列char _ col: Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 原來的打算大概是想刪除包含值“0 0” 的那兩行。但實(shí)際作用是刪除了所有的行。之所以這樣是由于MySQL的比較規(guī)則在起作用。char_col 為一個(gè)串列,但00 沒有用引號(hào)括起來,因此,它被作為數(shù)對(duì)待了。按MySQL的比較規(guī)則,涉及一個(gè)串與一個(gè)數(shù)的比較按兩個(gè)數(shù)的比較來求值。隨著DELETE 查詢的執(zhí)行,char_col 的每個(gè)值被轉(zhuǎn)換為0,”0 0”也被轉(zhuǎn)換為0,因此,所有不類似數(shù)的串都轉(zhuǎn)換成0。從而,對(duì)于每一行, WHERE 子句都為真,因此,DELETE 語句清空了該表。顯然,這是一種在執(zhí)行DELETE 前,應(yīng)該用SELECT 語句對(duì)WHERE 子句進(jìn)行測(cè)試的情況,這樣將會(huì)示出表達(dá)式所選擇的行太多了。如下所示: Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 如果不能肯定某個(gè)值的使用方式,可以利用MySQL的表達(dá)式求值機(jī)制將該值強(qiáng)制轉(zhuǎn)換為特定的類型: ; ■ 增加+ 0 或+ 0.0 到某項(xiàng)上以強(qiáng)制轉(zhuǎn)換到一個(gè)數(shù)值: Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換Mysql入門系列:MYSQL表達(dá)式求值和MYSQL類型轉(zhuǎn)換 3. 超范圍值或非法值的轉(zhuǎn)換 ; 超范圍值或非法值的轉(zhuǎn)換的基本原則為:無用輸入,無用輸出。如果不在存儲(chǔ)日期前對(duì)其進(jìn)行驗(yàn)證,那么可能會(huì)得到不喜歡的東西。下面給出一些MySQL處理超范圍值或不合適值的一般原則,這些內(nèi)容曾經(jīng)在前面介紹過: ; ■ 對(duì)于數(shù)值或T I M E列,超出合法范圍的值被剪裁為相應(yīng)取值范圍的最接近的數(shù)值并作為結(jié)果值存儲(chǔ)。 ; ■ 對(duì)于非ENUM 或SET 的串列,太長的串被截為適合該列存儲(chǔ)的最大長度的串。ENUM 或SET 列的賦值依賴于定義列時(shí)給出的合法值。如果賦予ENUM 列一個(gè)未作為枚舉成員給出的值,將會(huì)賦予一個(gè)錯(cuò)誤成員(即,對(duì)應(yīng)于零值成員的空串)。如果賦予SET 列一個(gè)包含未作為集合成員給出的子串的值,那么,那些未作為集合成員給出的子串將被刪除,并將剩余成員構(gòu)成的值賦給該列。 ; ■ 對(duì)于日期或時(shí)間列,非法值被轉(zhuǎn)換為該類型適當(dāng)?shù)摹傲恪敝担▍㈤啽? - 11)。對(duì)于非TIME 的日期和時(shí)間列,超出取值范圍的值可轉(zhuǎn)換為“零”值、NULL或某種其他的值(換句話說,結(jié)果是不可預(yù)料的)。 ; 這些轉(zhuǎn)換都將作為ALTER TABLE、LOAD DATA、UPDATE和多行INSERT 語句的警告信息報(bào)告。在mysql客戶機(jī)中,這些信息顯示在查詢報(bào)告的狀態(tài)行上。在編程語言中,可通過某些其他手段取得這個(gè)信息。如果使用的是MySQLC API,那么可調(diào)用mysql_info( ) 函數(shù)來獲得這個(gè)信息。對(duì)于Perl DBI API,可利用數(shù)據(jù)庫連接的mysql_info 屬性。所提供的這個(gè)信息是警告信息的次數(shù)計(jì)數(shù)。為了知道更改了哪些行,可發(fā)布一條SELECT ... INTOOUTFILE 查詢,并將結(jié)果與原始行進(jìn)行比較。
標(biāo)簽: MySQL 數(shù)據(jù)庫
主站蜘蛛池模板: 青青久久av北条麻妃海外网 | 日本成人午夜影院 | 久久精品一区二区三区四区 | 成人免费视频网站在线观看 | 亚洲三区在线观看 | 亚洲一区二区在线免费观看 | 日韩精品久久久久久 | 久久国内精品 | 国产高清在线看 | 久久久久久亚洲精品 | 国产精品久久久久久久久久99 | 国产乱码久久久久久一区二区 | 久久国产精品影视 | 黄色网址av | 欧美成视频 | 一级片av | 久草成人| 国产高清一二三区 | 久久久久久久av | 一区二区三区国产免费 | 一区二区三区四区免费观看 | 久久久久国产精品 | 在线观看www | 亚洲午夜一区 | 亚洲大尺度网站 | 欧美大片一区二区 | 欧美一区二区三区 | 中文字幕一区在线观看视频 | 久草精品视频 | 九九99热 | 欧美日韩在线免费 | 欧美久久久久 | 一级毛片中国 | 免费观看在线午夜影视 | www.亚洲一区 | 亚洲无吗视频 | 中文字幕色 | 久久久精品免费观看 | 国产精品久久久久久一区二区三区 | 成人精品视频在线观看 | 国产一区二区三区色淫影院 |