mysql 中 end like,MySQL 这三道必问面试题,你都会吗?
來源:JAVA面試精選
據(jù)群友面試反饋,整理了3道MySQL面試題,對很多人可能是小菜一碟,對這些熟悉,有更好的理解的話,可以留言補充,不斷完善我們的題庫。
MySQL查詢字段區(qū)不區(qū)分大小寫?
MySQL innodb的事務與日志的實現(xiàn)方式
MySQL binlog的幾種日志錄入格式以及區(qū)別
MySQL查詢字段區(qū)不區(qū)分大小寫?
答案是不區(qū)分
如何解決需要區(qū)分英文大小寫的場景
例如登錄用戶為admin,此時填寫ADMIN也能登錄,如果用戶名需要區(qū)分大小寫,你的做法是什么?
解決方案一
MySQL默認的字符檢索策略:utf8_general_ci,表示不區(qū)分大小寫。
可以使用utf8_general_cs,表示區(qū)分大小寫,也可以使用utf8_bin,表示二進制比較,同樣也區(qū)分大小寫 。
注意:在Mysql5.6.10版本中,不支持utf8_genral_cs
創(chuàng)建表時,直接設置表的collate屬性為utf8_general_cs或者utf8_bin;如果已經(jīng)創(chuàng)建表,則直接修改字段的Collation屬性為utf8_general_cs或者utf8_bin。
-- 創(chuàng)建表:CREATE TABLE testt(id INT PRIMARY KEY,name VARCHAR(32) NOT NULL) ENGINE = INNODB COLLATE =utf8_bin;-- 修改表結(jié)構(gòu)的Collation屬性ALTER TABLE TABLENAME MODIFY COLUMN COLUMNNAME VARCHAR(50) BINARY CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;復制代碼
解決方案二
直接修改sql語句,在要查詢的字段前面加上binary關(guān)鍵字
-- 在每一個條件前加上binary關(guān)鍵字select * from user where binary username = 'admin' and binary password = 'admin';-- 將參數(shù)以binary('')包圍select * from user where username like binary('admin') and password like binary('admin');復制代碼
MySQL innodb的事務與日志的實現(xiàn)方式
有多少種日志
錯誤日志:記錄出錯信息,也記錄一些警告信息或者正確的信息。
查詢?nèi)罩?#xff1a;記錄所有對數(shù)據(jù)庫請求的信息,不論這些請求是否得到了正確的執(zhí)行。
慢查詢?nèi)罩?#xff1a;設置一個閾值,將運行時間超過該值的所有SQL語句都記錄到慢查詢的日志文件中。
二進制日志:記錄對數(shù)據(jù)庫執(zhí)行更改的所有操作。
中繼日志:中繼日志也是二進制日志,用來給slave 庫恢復
事務日志:重做日志redo和回滾日志undo
事物的4種隔離級別
讀未提交(RU)
讀已提交(RC)
可重復讀(RR)
串行
事務是如何通過日志來實現(xiàn)的,說得越深入越好
事務日志是通過redo和innodb的存儲引擎日志緩沖(Innodb log buffer)來實現(xiàn)的,當開始一個事務的時候,會記錄該事務的lsn(log sequence number)號;
當事務執(zhí)行時,會往InnoDB存儲引擎的日志的日志緩存里面插入事務日志;
當事務提交時,必須將存儲引擎的日志緩沖寫入磁盤(通過innodb_flush_log_at_trx_commit來控制),也就是寫數(shù)據(jù)前,需要先寫日志。這種方式稱為“預寫日志方式”
MySQL binlog的幾種日志錄入格式以及區(qū)別
Statement:每一條會修改數(shù)據(jù)的sql都會記錄在binlog中。
優(yōu)點:不需要記錄每一行的變化,減少了binlog日志量,節(jié)約了IO,提高性能。
相比row能節(jié)約多少性能 與日志量,這個取決于應用的SQL情況,正常同一條記錄修改或者插入row格式所產(chǎn)生的日志量還小于Statement產(chǎn)生的日志量,但是考慮到如果帶條件的update操作,以及整表刪除,alter表等操作,ROW格式會產(chǎn)生大量日志,因此在考慮是否使用ROW格式日志時應該根據(jù)應用的實際情況,其所 產(chǎn)生的日志量會增加多少,以及帶來的IO性能問題。
缺點:由于記錄的只是執(zhí)行語句,為了這些語句能在slave上正確運行,因此還必須記錄每條語句在執(zhí)行的時候的一些相關(guān)信息,以保證所有語句能在slave得到和在master端執(zhí)行時候相同的結(jié)果。
另外mysql 的復制,像一些特定函數(shù)功能,slave可與master上要保持一致會有很多相關(guān)問題(如sleep()函數(shù), 1598281,以及user-defined functions(udf)會出現(xiàn)問題).
使用以下函數(shù)的語句也無法被復制:
LOAD_FILE()
UUID()
USER()
FOUND_ROWS()
SYSDATE() (除非啟動時啟用了 --sysdate-is-now 選項)
同時在INSERT …SELECT 會產(chǎn)生比 RBR 更多的行級鎖
Row:不記錄sql語句上下文相關(guān)信息,僅保存哪條記錄被修改。
優(yōu)點:binlog中可以不記錄執(zhí)行的sql語句的上下文相關(guān)的信息,僅需要記錄那一條記錄被修改成什么了。
所以rowlevel的日志內(nèi)容會非常清楚的記錄下 每一行數(shù)據(jù)修改的細節(jié)。而且不會出現(xiàn)某些特定情況下的存儲過程,或function,以及trigger的調(diào)用和觸發(fā)無法被正確復制的問題
缺點:所有的執(zhí)行的語句當記錄到日志中的時候,都將以每行記錄的修改來記錄,這樣可能會產(chǎn)生大量的日志內(nèi)容。
比如一條update語句,修改多條記錄,則binlog中每一條修改都會有記錄,這樣造成binlog日志量會很大,特別是當執(zhí)行alter table之類的語句的時候,由于表結(jié)構(gòu)修改,每條記錄都發(fā)生改變,那么該表每一條記錄都會記錄到日志中。
Mixedlevel: 以上兩種level的混合使用。
一般的語句修改使用statment格式保存binlog,如一些函數(shù),statement無法完成主從復制的操作,則采用row格式保存binlog,MySQL會根據(jù)執(zhí)行的每一條具體的sql語句來區(qū)分對待記錄的日志形式,也就是在Statement和Row之間選擇一種。
新版本的MySQL中對row level模式也被做了優(yōu)化,并不是所有的修改都會以row level來記錄,像遇到表結(jié)構(gòu)變更的時候就會以statement模式來記錄。
至于update或者delete等修改數(shù)據(jù)的語句,還是會記錄所有行的變更。
-End-
總結(jié)
以上是生活随笔為你收集整理的mysql 中 end like,MySQL 这三道必问面试题,你都会吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: supervisor监控php进程程序,
- 下一篇: 中国大学慕课python答案第七章_中国