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