<p>问题是,您将字符串显式编码为UTF-8字节,然后将该UTF-8字节转换为其字符串表示形式。你知道吗</p>
<p>这就是代码的含义:</p>
<pre><code>str(row[3].encode("utf-8"))
</code></pre>
<p>如果你不想那么做,就别那么做:</p>
<pre><code>row[3]
</code></pre>
<p>下面是一个示例,展示了您正在做的事情:</p>
<pre><code>>>> s = 'à'
>>> s
'à'
>>> s.encode('utf-8')
b'\xc3\xa0'
>>> str(s.encode('utf-8'))
"b'\\xc3\\xa0'"
</code></pre>
<p>你想要的是第一个。你知道吗</p>
<p>一般来说,在<code>bytes</code>上调用<code>str</code>几乎没有用。如果不可避免地有一个<code>bytes</code>并且需要一个<code>str</code>,那么可以通过调用<code>decode</code>方法来获得它。但在这种情况下,您不必有<code>bytes</code>。(我的意思是,你可以写<code>row[3].encode("utf-8").decode("utf-8")</code>,但那显然是相当愚蠢的。)</p>
<hr/>
<p>作为旁注,但非常重要的一点是,您不应该试图将值<code>str.format</code>放入SQL字符串中。只需使用查询参数。<a href="https://xkcd.com/327/" rel="nofollow noreferrer">Here's the obligatory xkcd link</a>这就解释了安全问题,除此之外,您的代码变得更加复杂,甚至效率更低。你知道吗</p>
<p>换言之,与其这样做:</p>
<pre><code>"VALUES ({:d}, \"{:s}\", \"{:s}\", \"{:s}\", \"{:s}\", \"{:s}\", \"{:s}\")".format(row[0], urlparse(row[1]).netloc, row[1], row[2].replace("\"", "'"), article_content, datetime.fromtimestamp(row[4]).strftime("%Y-%m-%d"), updated)
</code></pre>
<p>…就这么做:</p>
<pre><code>"VALUES (%s, %s, %s, %s, %s, %s, %s)"
</code></pre>
<p>然后,当您稍后执行查询时,传递参数,而无需将所有复杂的转换为字符串、引用和替换嵌入的引号,只需将值作为参数传递给<code>execute</code>。你知道吗</p>
<pre><code>db.execute(q_i, (
row[0], urlparse(row[i]).netloc, row[1], row[2], article_content,
datetime.fromtimestamp(row[4]).strftime("%Y-%m-%d"), updated))
</code></pre>
<p>事实上,如果你的下一个列是或可能是一个<code>DATETIME</code>列而不是<code>CHAR</code>/<code>VARCHAR</code>/<code>TEXT</code>/随便什么,你甚至不需要那个<code>strftime</code>;只需传递<code>datetime</code>对象。你知道吗</p>
<p>注意,这意味着您根本不需要对<code>article_content</code>做任何事情。引用内容既不是必要的,也不是一个好主意(除非您有其他特定于应用程序的原因需要避免在文章中使用<code>"</code>字符),而且编码内容并不能解决任何问题,只会导致一个新的问题。你知道吗</p>