彻底理解mysql服务器的字符集转换问题
主要參考這三個文章:
https://www.xiariboke.com/article/4147.html
http://blog.sina.com.cn/s/blog_690c46500100k1nf.html
http://www.cnblogs.com/springmvc-hibernate/archive/2010/01/04/2484353.html
其中 character_set_connection是在存儲數(shù)據(jù)庫 前的 經(jīng)過字符集編碼轉(zhuǎn)換的 內(nèi)容. 是 傳人字符集. 而character_set_result則是從數(shù)據(jù)庫內(nèi)部將數(shù)據(jù)取出來, 發(fā)送到客戶端時事先經(jīng)過的編碼內(nèi)容. 是 輸出時的字符集.
也就是說, connect的字符集 只是 管 傳人的. 不管 輸出的 , 而result才是 管輸出的.
注意的是, character_set_client這個字符集, 它只是 向服務(wù)器 "聲明" 說明的 字符集. 但并不表示 從客戶端 (比如Php程序編輯器edit vim notepad等) 傳入進來的sql 語句就一定是 (真的是) 這個client, 所以 client具有 欺騙性. 本身沒有多大必然的用處.. 但也并不是一定用處都沒有 : 當(dāng) 把傳入sql語句 存入 數(shù)據(jù)庫之前, 要把sql語句 從 client指定的字符集 -> 轉(zhuǎn)變?yōu)閏onnect字符集. 就起這點作用!
所以, 最好不要去隱藏和欺騙服務(wù)器, 要盡量將 編輯器的字符集和 client的字符集一致
實際上, 所有的問題, 是 不只是要關(guān)注 數(shù)據(jù)庫內(nèi)部 的存儲字符集, 還要關(guān)注 從 客戶端到 服務(wù)器的 連接層 的 字符集: 就是 當(dāng) sql語句 連接進來后, 服務(wù)器收到 sql語句后, 并不是 馬上 就進入 數(shù)據(jù)庫進行存儲, 而是要 先 放下來, 經(jīng)過 connect 連接字符集的處理后, 才能 進入數(shù)據(jù)庫. 這里, connect就相當(dāng)于 數(shù)據(jù)庫 進門時的 門衛(wèi)和看守, 而character_set_result就相當(dāng)于數(shù)據(jù)庫 出庫輸出 內(nèi)容的出門 時 的 門衛(wèi)和看守, 都要 經(jīng)果他們的 轉(zhuǎn)換的!
每天自動對 mysql數(shù)據(jù)庫的備份 shell腳本
備份命令: mysqldump -u root -p db_test > db_name.sql
還原: 有兩種方法, 一是 進入mysql后, 執(zhí)行 source命令;
二是, 還是在 shell下, 執(zhí)行 mysql命令: mysql -u root -p db_name < db_name.sql 跟登錄數(shù)據(jù)庫的命令類似, 只是后面 要加上 ( 數(shù)據(jù)庫名稱< 腳本名稱 )
推薦 用 第二種 mysql命令, 因為它可以直接在 shell下執(zhí)行.
mysqladmin 提供了對mysql數(shù)據(jù)庫 從外部的, 狀態(tài)上的 一個管理, 主要包括這些命令:
mysqladmin [options] command comand [...]
最常見的選項是 -uroot -p 通常都要把這兩個選項帶上
- create/drop databsename, 只能創(chuàng)建數(shù)據(jù)庫, 不能創(chuàng)建表, 而且不需要用 database這個關(guān)鍵字
- flush-... 刷新各種權(quán)限
- password 和 old-password 設(shè)置密碼;
- 其他輔助命令, ping, processlist. shutdown, status, version, start/stop-slave 從服務(wù)器管理.
學(xué)會做人生的減法了.
現(xiàn)在就是只 管php和mysq語言了, 太多的東西, 已經(jīng)不能兼顧了.
要把mysql當(dāng)作是一個獨立的開發(fā)語言, 熟悉并能熟練應(yīng)用 它里面的函數(shù)和各種結(jié)構(gòu)的用法.
mysql中的字符串函數(shù)包括:
ascii/char : 將數(shù)字和字符進行轉(zhuǎn)換的函數(shù). 比如: ascii('abc') 總是轉(zhuǎn)換第一字符, 配合substr可以 查看任何一個字符, char(89)轉(zhuǎn)換數(shù)字到字符
cast(變量/字段 as to_type): mysql的類型轉(zhuǎn)換函數(shù), 強制轉(zhuǎn)換;
concat 字符串連接函數(shù): 可以將最終返回字符串 str_ret跟中間 結(jié)果的字符串 相連接, 節(jié)省一個中間變 量; 可以將數(shù)字和數(shù)字字符串相連接, 或?qū)?shù)字和字母字符串相連接;
+: 在mysql中,加號總是用來表示 數(shù)字相加, 如果是字符串用加號連接, 總是 盡量 /企圖 將"數(shù)字字符串" 轉(zhuǎn)換成數(shù)字, 所以 如果是字母字符串跟數(shù)字相加, 則總是將 字母字符串忽略即為0..
2. 只有 “字符”類型的字段,比如char, varchar, text等才需要指定字符集編碼和 collate。其他比如 int, boolean等類型類型則不需要指定 字符集.
是否可以用 charset 來代替 character set?
在help create table中, 提示的是 : [default] character set [=] charset_name. 當(dāng)然你可以用 character set utf8 來指定, 但是 你也可以 [肯定是可以的] 用 charset 來指定. 而且即使你用 character set來指定的字符集, 你用show create table foo;來查看, 顯示的結(jié)果也是 用的 charset...
where子句, 只能使用 在 對 "數(shù)據(jù)表"的 操作中! 也就是里面要有表, 要有字段, 否則就會出錯.
在mysql中的循環(huán)語句, 沒有/不支持 for 循環(huán)語句! 只有while do end while; repeat util end repeat; lp1: loop ... leave lp1...end loop語句!
對于mysql而言, 根本就不需要適用 圖形化的 客戶端界面, 因為那種方式 效率太低, 不能理解/記憶很多的mysql操作語句, 不能深入理解了解mysql的內(nèi)在, 所以 直接使用 mysql的命令行控制臺客戶端, 這是每個linux程序員最基本的素質(zhì).
關(guān)于select中的rand() 函數(shù)的使用??
- 也就是說, select實際上有兩個作用, 有兩種使用場景: 一是: 純粹的輸出, print, output, 并不牽涉到 "表的 查詢" ! 另一種是: 對表的 操作中, 作為 對表的 查詢 動作;
- select語句中, 如果牽涉到 表的 查詢, 最好是 不要使 用 rand() 函數(shù), 因為使用rand隨機函數(shù)時, 會進行多次計算和查詢. 通常 應(yīng)該將確定性的 函數(shù)如 max, avg , count等放在 select 對 表的 查詢語句中, 然后, 將 rand()函數(shù) 用在 跟 查詢結(jié)果的 四則運算中.
- 要注意的是, select about_function(rand())語句中, select只是 起到 "輸出 "的作用, 并沒有 查詢的 意思和操作!
比如: select * from student where id > round(rand()*(select max(id) from student))
如果要抽出 多個隨機性的記錄行結(jié)果?
應(yīng)該使用的方法是: 第一 ,要 能夠正確的 適用 rand()函數(shù), 第二, 要在一次查詢操作中, 只輸出一個 記錄行, 然后使用mysql中的循環(huán)結(jié)構(gòu)多次輸出...
即:
但是 這個有可能會取到跟上一次 一樣的記錄, (同一條記錄) 因此, 要判斷一下, 當(dāng)前取出的這條記錄的某個關(guān)鍵字(key, 或 primary key) 跟上一條記錄的primary key是否是一樣的, 如果不是一樣的 , 則接收, 同時 計數(shù)器i 加1, ... 如果是一樣的 , 則不接收, 放棄后面的操作, 同時 i也不要 增加.
set @pre_id=0; set @cur_id=0;while i< rec_num doselect id into @sel_id , other_filed into @other_field from user where id > round(rand()*(select max(id) from use)) limit 1; if @pre_id <> @sel_id thenset i=i+1;-- 返回 @sel_id, @other_fieldend if;if @pre_id = @cur_id then-- 此時 循環(huán)變量i 不要加1end if;end while在mysql中, 可以直接使用 變量, 而不必 事先定義該變量. 但是一個變量, 如果事先沒有聲明 初始化賦值, 那么 它的值就是 NULL, NULL跟任何東西運算,都將得到NULL.
MariaDB [test]> select @pre_name; +-----------+ | @pre_name | +-----------+ | NULL | +-----------+ 1 row in set (0.00 sec)MariaDB [test]>在 select語句中, 給 變量賦值 有兩種方式, 即 select ...into, select a:=b
select name into @name from t where...
第二種方法是: select @name2:=name from t where ...
在這兩種方法中, 都不需要 事先 聲明/定義/初始化 變量 @name @name2等.
注意的是, select中 不能 直接使用 a=b 的方式 來 賦值.
關(guān)于mysql中的特殊 常量?
有三個特殊的常量: TRUE, FALSE, NULL
這三個特殊常量, 是不分大小寫的! 比如: true, True, 都是和TRUE一樣的, 同樣null和 Null 更 NULL也是一樣的! 在寫法上沒有區(qū)別!
mysql的特殊類型 boolean和 tinyint?
在mysql中, 是沒有boolean 類型的. 而true 和 false 是當(dāng)做 tinyint(1)來處理的, 注意 這里的1, 表示 的是, 只顯示一位數(shù)! 并不是說它的取值范圍.
mysql中的游標(biāo)cursor 的使用? http://www.cnblogs.com/Luouy/p/7301360.html
mysql中的 循環(huán)有三種, while ,和 loop 和 repeat中的 "break 和 continue?"
轉(zhuǎn)載于:https://www.cnblogs.com/bkylee/p/7826834.html
總結(jié)
以上是生活随笔為你收集整理的彻底理解mysql服务器的字符集转换问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Ioc 源码分析(一)-
- 下一篇: 编译安装Mysql5.6.36