1、本地數(shù)據(jù)庫連接
成都創(chuàng)新互聯(lián)公司長期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為大興企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、網(wǎng)站設(shè)計,大興網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
Driver={MySQL};Server=localhost;Option=16834;Database=myDataBase;
2、遠程數(shù)據(jù)連接
Driver={MySQL};Server=myServerAddress;Option=131072;Stmt=;Database=myDataBase; User=myUsername;Password=myPassword;
首先說截取字符串函數(shù):
SUBSTRING(commentid,9)
這個很簡單,從第9個字符開始截取到最后。SUBSTRING的參數(shù)有三個,最后一個是截取的長度,默認是到結(jié)尾,負數(shù)是倒數(shù)第幾位。
接著說拆分字符串函數(shù):
SUBSTRING_INDEX(commentid, '-', 1)
這個就稍稍復(fù)雜一些了,他的意思是以 - 進行拆分字符串,從第一個關(guān)鍵詞開始取前面所有的字符串。如果上面的第三個參數(shù)修改為 -1,那么就是取倒數(shù)第一個。如果我們想從字符串 c-11065-50 中,取出50或者11065如何寫呢?
取得50的寫法:
代碼如下:
SELECT SUBSTRING_INDEX(checkid,'-',-1) FROM `check` WHERE checkid = 'c-11065-50'
取得11065的寫法:
代碼如下:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(checkid,'-',-2),'-',1) FROM check WHERE checkid = 'c-11065-50'
或者:
代碼如下:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(checkid,'-',2),'-',-1) FROM check WHERE checkid = 'c-11065-50'
看上去比較復(fù)雜了吧,那么再來點更復(fù)雜的:
這下面就是組合用法了,例如我們要截?。篶ontent_13-11220-1中的13,最簡單的就是:
復(fù)制代碼 代碼如下:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING(commentid,9), '-', 1), '-',-1) FROM check WHERE commentid = 'content_13-11220-1'
我們發(fā)現(xiàn)這里需要調(diào)用三次函數(shù),有沒有可以調(diào)用兩次的呢。于是我們可以這樣寫:
復(fù)制代碼 代碼如下:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(commentid, '-', 1), '_',-1) FROM check WHERE commentid = 'content_13-11220-1'
字符串類型( )
MySQL 支持多種字符串類型 每種類型還有很多變種 這些數(shù)據(jù)類型在 和 版本發(fā)生了很大的變化 使得情況更加復(fù)雜 從MySQL 開始 每個字符串列可以定義自己的字符集和排序規(guī)則 或者說校對規(guī)則(collation)(更多關(guān)于這個主題的信息請參考第 章) 這些東西會很大程度上影響性能
VARCHAR 和CHAR 類型
VARCHAR 和CHAR 是兩種最主要的字符串類型 不幸的是 很難精確地解釋這些值是怎么存儲在磁盤和內(nèi)存中的 因為這跟存儲引擎的具體實現(xiàn)有關(guān) 下面的描述假設(shè)使用的存儲引擎是InnoDB 和/ 或者MyISAM 如果使用的不是這兩種存儲引擎 請參考所使用的存儲引擎的文檔
先看看VARCHAR 和CHAR 值通常在磁盤上怎么存儲 請注意 存儲引擎存儲CHAR 或者VARCHAR 值的方式在內(nèi)存中和在磁盤上可能不一樣 所以MySQL 服務(wù)器從存儲引擎讀出的值可能需要轉(zhuǎn)換為另一種存儲格式 下面是關(guān)于兩種類型的一些比較
VARCHAR
VARCHAR 類型用于存儲可變長字符串 是最常見的字符串數(shù)據(jù)類型 它比定長類型更節(jié)省空間 因為它僅使用必要的空間(例如 越短的字符串使用越少的空間) 有一種情況例外 如果MySQL 表使用ROW_FORMAT=FIXED 創(chuàng)建的話 每一行都會使用定長存儲 這會很浪費空間
VARCHAR 需要使用 或 個額外字節(jié)記錄字符串的長度 如果列的最大長度小于或等于 字節(jié) 則只使用 個字節(jié)表示 否則使用 個字節(jié) 假設(shè)采用latin 字符集 一個VARCHAR( ) 的列需要 個字節(jié)的存儲空間 VARCHAR( ) 的列則需要 個字節(jié) 因為需要 個字節(jié)存儲長度信息
VARCHAR 節(jié)省了存儲空間 所以對性能也有幫助 但是 由于行是變長的 在UPDATE 時可能使行變得比原來更長 這就導(dǎo)致需要做額外的工作 如果一個行占用的空間增長 并且在頁內(nèi)沒有更多的空間可以存儲 在這種情況下 不同的存儲引擎的處理方式是不一樣的 例如 MyISAM 會將行拆成不同的片段存儲 InnoDB則需要分裂頁來使行可以放進頁內(nèi) 其他一些存儲引擎也許從不在原數(shù)據(jù)位置更新數(shù)據(jù)
下面這些情況下使用VARCHAR 是合適的 字符串列的最大長度比平均長度大很多 列的更新很少 所以碎片不是問題 使用了像UTF 這樣復(fù)雜的字符集 每個字符都使用不同的字節(jié)數(shù)進行存儲
在 或者更高版本 MySQL 在存儲和檢索時會保留末尾空格 但在 或更老的版本 MySQL 會剔除末尾空格
InnoDB 則更靈活 它可以把過長的VARCHAR 存儲為BLOB 我們稍后討論這個問題
CHAR
CHAR 類型是定長的 MySQL 總是根據(jù)定義的字符串長度分配足夠的空間 當存儲CHAR 值時 MySQL 會刪除所有的末尾空格(在MySQL 和更老版本中VARCHAR也是這樣實現(xiàn)的 也就是說這些版本中CHAR 和VARCHAR 在邏輯上是一樣的 區(qū)別只是在存儲格式上) CHAR 值會根據(jù)需要采用空格進行填充以方便比較
CHAR 適合存儲很短的字符串 或者所有值都接近同一個長度 例如 CHAR 非常適合存儲密碼的MD 值 因為這是一個定長的值 對于經(jīng)常變更的數(shù)據(jù) CHAR 也比VARCHAR 更好 因為定長的CHAR 類型不容易產(chǎn)生碎片 對于非常短的列 CHAR 比VARCHAR 在存儲空間上也更有效率 例如用CHAR( ) 來存儲只有Y 和N 的值 如果采用單字節(jié)字符集注 只需要一個字節(jié) 但是VARCHAR( ) 卻需要兩個字節(jié) 因為還有一個記錄長度的額外字節(jié)
CHAR 類型的這些行為可能有一點難以理解 下面通過一個具體的例子來說明 首先 我們創(chuàng)建一張只有一個CHAR( ) 字段的表并且往里面插入一些值
當檢索這些值的時候 會發(fā)現(xiàn)string 末尾的空格被截斷了
如果用VARCHAR( ) 字段存儲相同的值 可以得到如下結(jié)果
數(shù)據(jù)如何存儲取決于存儲引擎 并非所有的存儲引擎都會按照相同的方式處理定長和變長的字符串 Memory 引擎只支持定長的行 即使有變長字段也會根據(jù)最大長度分配最大空間 不過 填充和截取空格的行為在不同存儲引擎都是一樣的 因為這是在MySQL 服務(wù)器層進行處理的
返回目錄 高性能MySQL
編輯推薦
ASP NET MVC 框架揭秘
Oracle索引技術(shù)
ASP NET開發(fā)培訓(xùn)視頻教程
lishixinzhi/Article/program/MySQL/201311/29687
GROUP_CONCAT(expr) 完整句法如下: GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] [,col ...]] [SEPARATOR str_val])這個函數(shù)在 MySQL 4.1 中被加入。函數(shù)返回一個字符串結(jié)果,該結(jié)果由分組中的值連接組合而成: mysql SELECT student_name, - GROUP_CONCAT(test_score) - FROM student - GROUP BY student_name;ormysql SELECT student_name, - GROUP_CONCAT(DISTINCT test_score - ORDER BY test_score DESC SEPARATOR " ") - FROM student - GROUP BY student_name;在MySQL 中,你可以得到表達式結(jié)合體的連結(jié)值。通過使用 DISTINCT 可以排除重復(fù)值。如果希望對結(jié)果中的值進行排序, 可以使用 ORDER BY 子句。為了以倒序排序,可以在 ORDER BY 子句中用于排序的列名后添加一個 DESC (遞減 descending) 關(guān)鍵詞 。缺省為升序;這也可以通過使用 ASC 關(guān)鍵詞明確指定。 SEPARATOR 是一個字符串值,它被用于插入到結(jié)果值中。缺省為一個逗號 (",")。 你可以通過指定 SEPARATOR "" 完全地移除這個分隔符。 在你的配置中,通過變量 group_concat_max_len 要以設(shè)置一個最大的長度。 在運行時執(zhí)行的句法如下: SET [SESSION | GLOBAL] group_concat_max_len = unsigned_integer;如果最大長度被設(shè)置,結(jié)果值被剪切到這個最大長度。 GROUP_CONCAT() 函數(shù)是一個增強的 Sybase SQL Anywhere 支持的基本 LIST() 函數(shù)。 如果只有一個列,并且沒有其它選項被指定,GROUP_CONCAT() 是向后兼容有極大限制的 LIST() 函數(shù)。
使用concat函數(shù)
mysql select concat('11','22','33');
+------------------------+
| concat('11','22','33') |
+------------------------+
| 112233 |
+------------------------+
比如說,要生成一個10位的隨機字符串,可以使用如下語句:
運行結(jié)果:
該語句只能生成最長32位(但只有0~9,a~f共16種字符)的字符串,如果需要更長的字符,可以使用 concat 函數(shù)連接多個字符串,如下所示:
這個語句可以生成長度為42個字符的字符串。
運行結(jié)果:
因為 uuid() 函數(shù)返回的字符串中會包含特殊字符 "-" , 所以我們需要通過 replace 函數(shù)將這個特殊字符全部替換掉。這種方式會得到一個32位的字符串,如果有長度要求,可以用substring或concat函數(shù)裁剪或拼接。
運行結(jié)果: