1. 程式人生 > 資料庫 >解決mysql 組合AND和OR帶來的問題

解決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起到了兩個作用:

  1. 直接支援全球所有語言,每個國家都可以不再使用自己之前的舊編碼了,用unicode就可以了。(就跟英語是全球統一語言一樣)
  2. 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的執行過程

  1. 直譯器找到程式碼檔案,把程式碼字串按檔案頭定義的編碼載入到記憶體,轉成unicode
  2. 把程式碼字串按照語法規則進行解釋
  3. 所有的變數字元都會以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使用的編碼
  • 作業系統的語言設定