日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

彻底理解mysql服务器的字符集转换问题

發(fā)布時間:2025/3/17 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 彻底理解mysql服务器的字符集转换问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

主要參考這三個文章:
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



  • 字符集以數(shù)據(jù)庫為對象來說, 可以分為數(shù)據(jù)庫內(nèi)部操作的字符集, (即: character_set_server, database, table,field)和數(shù)據(jù)庫外部的字符集.
  • 其中 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í)行.

  • 一個常識: 在命令行操作 mysql的命令(相關(guān)命令)時, 一定要加上操作用戶和密碼選項. 這樣mysql服務(wù)器才能 決定是否有權(quán)執(zhí)行... 而且 指定密碼的 方式是: -p 不要直接寫密碼值.
  • 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..

    mysql> select 2a + 3; ERROR 1054 (42S22): Unknown column '2a' in 'field list' mysql> select '2a' + 3; +----------+ | '2a' + 3 | +----------+ | 5 | +----------+ 1 row in set, 1 warning (0.00 sec)mysql>
  • 字符串截取函數(shù): left(str, length), right(str, length), substring(str, start, length), substring_index(str, delimiter, length). 其中, mid, subst函數(shù) 是 substring函數(shù)的別名alias. 需要注意的是, 所有的mysql的字符串截取函數(shù), 首字符start都是從1開始的. 而不是從0開始的.uuid()函數(shù), 生成36位的隨機字符串: 8-4-4-4-12(個數(shù)) 的 隨機字符串. 分成5個部分: 8, 4,4,4 , 12. 但是uuid()不適合用來做主鍵!replace(str, from, to): replace("abc-amn-axy", 'a", '#'): 結(jié)果是: #bc-#mn-#xy. instr(haystack, needle): 判斷needle在hay中的初始出現(xiàn)的位置,從1開始, 如果沒有找到則返回0,hay為 null也返回0.rand()是生成在0和1之間的 隨機數(shù). 可以給rand指定一個參數(shù), 作為種子, 那么 rand(seed)會產(chǎn)生固定的相同的隨機數(shù), 改變N種子, 也就能夠改變隨機數(shù). rand() 函數(shù)也不需要 進行播種..要生成 x~ y之間的隨機數(shù), 可以使用: x+(y-x)*rand(); 這個隨機數(shù)是小數(shù), 還要用 round或floor, ceil來生成整數(shù). 其中 , floor可以得到下限值, 比如x, ceil可以得到 上限值, 比如 y.

    2. 只有 “字符”類型的字段,比如char, varchar, text等才需要指定字符集編碼和 collate。其他比如 int, boolean等類型類型則不需要指定 字符集.

  • 使用$where = " where 1 "; 然后后面的所有條件語句的拼接都可以 and 的統(tǒng)一形式進行書寫, 而不 用去判斷是否是第一個條件字符串...
  • 是否可以用 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...

    mysql> create table bar(id int not null) character set utf8; Query OK, 0 rows affected (0.05 sec)mysql> show create table bar; +-------+-------------------------------------------------------- ------------+ | Table | Create Table| +-------+-------------------------------------------------------- ------------+ | bar | CREATE TABLE `bar` (`id` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | ### 這里的字符集指定都是用的 charset這種簡寫方式, 和 character set 這種全寫方式, 完全是一樣的! +-------+-------------------------------------------------------- ------------+ 1 row in set (0.00 sec)
  • select 10 where 1; 為什么報錯?
    where子句, 只能使用 在 對 "數(shù)據(jù)表"的 操作中! 也就是里面要有表, 要有字段, 否則就會出錯.
  • 對于where子句來說, 通常是不區(qū)分大小寫的, 只有在使用 like 條件運算符的時候, 才區(qū)分大小寫! 如果要區(qū)分大小,可以使用 binary關(guān)鍵字, 就是以字節(jié)位單位來比較的.
  • length是按字節(jié)來計算的. 而char_length 是按字符個數(shù)來計算長度的.
  • 在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)多次輸出...
    即:

    while i< rec_num doselect * from student where id > round(rand()*(select max(id) from student)) limit 1; # id > round(...)的記錄有很多個, 我們每次只選擇一個limit 1. end while

    但是 這個有可能會取到跟上一次 一樣的記錄, (同一條記錄) 因此, 要判斷一下, 當(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?"

  • loop和 repeat中 就相當(dāng)于 c/c++語言中的 do ....while(condition...)
  • mysql中, 使用 break和continue的對應(yīng) 關(guān)鍵字 是: iterate 和 leave
  • 但是要配合 標(biāo)號/標(biāo)識表示: 比如: loop_name: lp:
  • 轉(zhuǎn)載于:https://www.cnblogs.com/bkylee/p/7826834.html

    總結(jié)

    以上是生活随笔為你收集整理的彻底理解mysql服务器的字符集转换问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。