Re: [問題] 中文寫進MSSQL變成亂碼

看板Python作者 (迅雷不及掩耳盜鈴)時間1年前 (2022/11/04 15:07), 1年前編輯推噓3(304)
留言7則, 5人參與, 1年前最新討論串2/3 (看更多)
※ 引述《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, 1年前 , 1F
另外如果對於資料庫存取效率沒什麼要求,可以考慮其他套件
11/04 15:22, 1F

11/04 15:24, 1年前 , 2F
比如 pyodbc 可以指定 setdecoding, setencoding
11/04 15:24, 2F

11/04 15:51, 1年前 , 3F
尼是好人
11/04 15:51, 3F

11/04 16:03, 1年前 , 4F
其實應該把stackoverflow規則貼過來 裡面要求要能最小
11/04 16:03, 4F

11/04 16:03, 1年前 , 5F
化重現問題程式碼
11/04 16:03, 5F

11/04 16:17, 1年前 , 6F
推這篇
11/04 16:17, 6F

11/04 20:15, 1年前 , 7F
推好心
11/04 20:15, 7F
文章代碼(AID): #1ZPBeyHC (Python)
文章代碼(AID): #1ZPBeyHC (Python)