解決mysql 組合AND和OR帶來的問題
原文出處:https://www.cnblogs.com/alex3714/articles/7550940.html
編碼種類
- ASCII佔1個位元組,只支援英文
- GB2312佔2個位元組,支援6700+漢字
- GBK GB2312的升級版,支援21000+漢字
- Shift-JIS日本字元
- TIS-620 泰國編碼
由於每個國家都有自己的字元,所以其對應關係也涵蓋了自己國家的字元,但是以上編碼都存在侷限性,即:僅涵蓋本國字元,無其他國家字元的對應關係。應運而生出現了萬國碼,他涵蓋了全球所有的文字和二進位制的對應關係
- unicode 2-4位元組,已經收錄了136690個字元,一直在不斷增長..
Unicode起到了兩個作用:
- 直接支援全球所有語言,每個國家都可以不再使用自己之前的舊編碼了,用unicode就可以了。(就跟英語是全球統一語言一樣)
- unicode包含了跟全球所有國家編碼的對映關係。
Unicode解決了字元和二進位制的對應關係,但是使用unicode表示一個字元,太浪費空間。例如:利用unicode表示“Python”需要12個位元組才能表示,比原來ASCII表示增加了1倍。
由於計算機的記憶體比較大,並且字串在內容中表示時也不會特別大,所以內容可以使用unicode來處理,但是儲存和網路傳輸時一般資料都會非常多,那麼增加1倍將是無法容忍的!!!
為了解決儲存和網路傳輸的問題,出現了Unicode Transformation Format,學術名UTF,即:對unicode中的進行轉換,以便於在儲存和網路傳輸時可以節省空間!
- UTF-8: 使用1、2、3、4個位元組表示所有字元;優先使用1個字元、無法滿足則使增加一個位元組,最多4個位元組。英文佔1個位元組、歐洲語系佔2個、東亞佔3個,其它及特殊字元佔4個
- UTF-16: 使用2、4個位元組表示所有字元;優先使用2個位元組,否則使用4個位元組表示。
- UTF-32: 使用4個位元組表示所有字元;
總結:UTF是unicode編碼 設計的一種 在儲存和傳輸時節省空間的編碼方案。
字元在硬碟上的儲存
無論以什麼編碼在記憶體裡顯示字元,存到硬碟上都是2進位制。
需要注意的是,以某種編碼存到硬碟,從硬碟讀出來的時候就必須用那種編碼讀,要不然就亂了。
python3的執行過程
- 直譯器找到程式碼檔案,把程式碼字串按檔案頭定義的編碼載入到記憶體,轉成unicode
- 把程式碼字串按照語法規則進行解釋
- 所有的變數字元都會以unicode編碼宣告
如果使用python3的話,我們用utf8編碼的檔案可以在windows下的終端(gbk)正常顯示,是因為到了記憶體裡python直譯器會把utf8轉成unicode,在輸出的時候,如果你的終端是gbk編碼的或者是utf8編碼的,python3就會把unicode轉成gbk或utf8。(unicode可以和任意編碼格式靈活轉換)
但僅限於python3,並不是所有的變成語言在記憶體裡預設編碼都是unicode的,比如 python2就不是,它的預設編碼是ASCII,想寫中文,就必須宣告檔案頭的coding為gbk or utf8,宣告之後,python2的直譯器僅以檔案頭宣告的編碼去解釋你的程式碼,載入到記憶體後,並不會主動幫你轉成unicode,也就是說,你的檔案編碼是utf-8,載入到記憶體裡,你的變數字串就也是utf8,意味著,你以utf8編碼的檔案,在windows是亂碼..
既然Python2並不會自動的把檔案編碼轉為unicode存在記憶體裡, 那就只能使出最後一招了,你自己人肉轉。Py3 自動把檔案編碼轉為unicode必定是呼叫了什麼方法,這個方法就是,decode(解碼) 和encode(編碼)
UTF-8 --> decode 解碼 --> Unicode Unicode --> encode 編碼 --> GBK / UTF-8 ..
python bytes型別
在python2中,byte==str, unicode是一個單獨型別
由於Python創始人在開發初期認知的侷限性,其並未預料到python能發展成一個全球流行的語言,導致其開發初期並沒有把支援全球各國語言當做重要的事情來做,所以就輕佻的把ASCII當做了預設編碼。 當後來大家對支援漢字、日文、法語等語言的呼聲越來越高時,Python於是準備引入unicode,但若直接把預設編碼改成unicode的話是不現實的, 因為很多軟體就是基於之前的預設編碼ASCII開發的,編碼一換,那些軟體的編碼就都亂了。所以Python 2 就直接 搞了一個新的字元型別,就叫unicode型別,比如你想讓你的中文在全球所有電腦上正常顯示,在記憶體裡就得把字串存成unicode型別
python3 unicode==str, byte是一個單獨的型別
為什麼在py3裡,把unicode編碼後,字串就變成了bytes格式? 你直接給我直接列印成gbk的字元展示不好麼?我想其實py3的設計真是煞費苦心,就是想通過這樣的方式明確的告訴你,想在py3裡看字元,必須得是unicode編碼,其它編碼一律按bytes格式展示。
最後再提示一下,Python只要出現各種編碼問題,無非是哪裡的編碼設定出錯了
常見編碼錯誤的原因有:
- python直譯器的預設編碼
- python原始檔檔案編碼
- Terminal使用的編碼
- 作業系統的語言設定