Re: [問題] 中文寫進MSSQL變成亂碼
※ 引述《ReTryx ()》之銘言:
: 想請教各位高手們有沒有遇到如標題的問題過?google完也試過網路上的解法,都無法成
: 功。
: 以下是環境以及問題
前面先囉嗦一下,有時候看到一些問題會懶
得回答(不是指這篇,而是前面幾篇有感)
,是因為每個人的時間都是很寶貴的,而回
答問題從來都不是別人的義務;有不少篇我
看下來的感覺都是:
「我這個不會,你看完之後教我吧!」
「你說的好難喔,直接給我程式碼吧!」
有時光是要重現問題,把環境設定一致,隨
著問題的複雜程度都可能要花上十分鐘半小
時了,別人當然懶了……同樣時間我拿去看
個影集還比較爽一些。
---
回到這個問題,我試著說明一下,作為「幫
忙解決問題的人,我希望能夠獲得哪些資訊
?」
推文的上下文不明確,是因為這裡涉及了編
碼問題,而這個問題的一些關鍵,並不能從
你最初的敘述中看出是哪一段出了問題。
因為:
(1) 你使用的編輯器可以選擇編碼
(2) 你使用的資料庫客戶端可以選擇編碼
(3) Python 版本會影響編碼處理機制
讓我們來看看敘述部分:
: 我用pymssql 連 mssql, 在連線的時候一定要把charset 也寫進去,不然會出現錯誤,而
: 我charset 是用CP950
這段沒什麼問題,但你是不是沒有提供版本
呢?以現在 2022 年來說,應該絕大多數的
使用者都會選擇 Python3 而非 Python2 了
,但是有時候礙於公司內部環境限制,仍然
有可能使用後者。
所以我會先預設你是使用 Python3
但是你推文又提到會顯示宣告編碼:
# -*- coding: utf-8 -*-
由於 Python3 預設已經使用 UTF-8 所以除
非要變更,不然通常不會添加這段到程式碼
中,那麼別人要怎麼知道你使用的是哪一個
版本呢?
: 接著在insert中文進SQL後,在SQL裡面看會發現insert進去的都是亂碼。但如果用Python
: 再select 出來卻會是中文。
這段的問題如下:
> "Insert 中文進 SQL"
怎麼 INSERT?運行的程式碼是?
該段程式碼是以什麼編碼儲存的?
SQL 指的是查詢語言不是資料庫
雖然看得懂但我更希望說清楚是 MSSQL
> "在 SQL 裡面看會發現都是亂碼"
雖然從敘述中我知道是 MSSQL
但是連線使用的客戶端眾多,是哪個?
你是在終端裡面看到亂碼?
還是客戶端圖形介面裡看到亂碼?
SQL Server Management Studio 嗎?
Navicat 嗎?DataGrip 嗎?
PowerShell 下使用命令行嗎?
Python REPL 下使用 pymssql 撈嗎?
(上述二者又牽扯到終端機的編碼)
Jupyter Notebook 上看嗎?
(又牽扯到瀏覽器的編碼)
> "用 Python 再 SELECT 出來卻是中文"
在哪裡操作執行 Python 呢?
開發環境整合的內嵌終端機嗎?
還是撈出來又存入了文件查看?
: 但如果是SQL裡面本來就是中文的資料,從Python select 出來就也會變成亂碼在Python
: 上,同樣的,用Python 寫進去變成亂碼的中文由其他語言讀出來也會是亂碼。
其實你自己也不清楚究竟問題出在哪裡,
這個原因大概是對於編碼轉換,還有字串
與文字怎麼儲存的基礎知識並不理解的原
因。
你有沒有想過:
「一段文字是怎麼被儲存的呢?」
「編碼是幹嘛用的?」
有時候我會覺得這是書到用時方恨少,畢
竟這個是計算機概論就會提及的內容,而
在作業系統、計算機網路等相關學科都會
一再地重複出現。
---
我這邊只提供一些知識點,因為涉及兩個
版本,你必須自己去搞清楚。
(1) 在 Python 中有兩種資料型別可以代
表字元資料的序列:bytes, str
(2) bytes 存放原始無符號的八位元值,
並以 ASCII 編碼顯示
(3) str 存放含有 Unicode 的碼位
(code points)
(4) 搞清楚今天拿到的是 Unicode 資料還
是 Binary 資料
(5) 上述這些是指 Python3,在 Python2
中則沒有明確區分
(6) 檔案儲存的時候是二進制
: 簡單來說就是Python寫進去的中文亂碼只能由Python 自己讀來才能解碼成中文。而本來
: 在DB裡就是中文的資料Python 讀出來就會變成亂碼。
: 我試過用encode and decode,但還是無解。請問有人成功試過從中文從Python寫進MSSQL
: 裡面不會變成亂碼的嗎?
可能原因太多了,你需要花時間自己去釐
清一下,我只列可能的狀況:
(1) 你的操作是正確的,但既有存入的中
文本身編碼沒有正確處理
(2) 你的操作是錯誤的,而既有存入的中
文本身編碼已被正確處理
情況二比較有可能,比如你編輯器裡使用
UTF8 卻又告知要以 Big5 進行編碼,過
程中又沒有妥善處理解碼跟編碼問題(跟
版本有關),導致最後存進去的東西是四
不像。
先搞清楚究竟是哪一段的編碼解碼造成問
題,或者說哪一段的編碼導致顯示問題。
: 感謝幫忙
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.138.237.231 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1667545660.A.44C.html
※ 編輯: Hsins (223.138.237.231 臺灣), 11/04/2022 15:10:05
→
11/04 15:22,
2年前
, 1F
11/04 15:22, 1F
→
11/04 15:24,
2年前
, 2F
11/04 15:24, 2F
推
11/04 15:51,
2年前
, 3F
11/04 15:51, 3F
→
11/04 16:03,
2年前
, 4F
11/04 16:03, 4F
→
11/04 16:03,
2年前
, 5F
11/04 16:03, 5F
推
11/04 16:17,
2年前
, 6F
11/04 16:17, 6F
推
11/04 20:15,
2年前
, 7F
11/04 20:15, 7F
推
11/09 23:23, , 8F
11/09 23:23, 8F
討論串 (同標題文章)
Python 近期熱門文章
PTT數位生活區 即時熱門文章