作者Hsins (迅雷不及掩耳盗铃)
看板Python
标题Re: [问题] 中文写进MSSQL变成乱码
时间Fri Nov 4 15:07:38 2022
※ 引述《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://webptt.com/cn.aspx?n=bbs/Python/M.1667545660.A.44C.html
※ 编辑: Hsins (223.138.237.231 台湾), 11/04/2022 15:10:05
1F:→ Hsins: 另外如果对於资料库存取效率没什麽要求,可以考虑其他套件 11/04 15:22
2F:→ Hsins: 比如 pyodbc 可以指定 setdecoding, setencoding 11/04 15:24
3F:推 cuteSquirrel: 尼是好人 11/04 15:51
4F:→ surimodo: 其实应该把stackoverflow规则贴过来 里面要求要能最小 11/04 16:03
5F:→ surimodo: 化重现问题程式码 11/04 16:03
6F:推 tzouandy2818: 推这篇 11/04 16:17
7F:推 ToastBen: 推好心 11/04 20:15