1

我正在使用带有 SlashDB 的 SQL Server。它一直运行良好。今天发生了错误,可能是说我定义了错误的数据库字符集。我收到此错误:

值错误 | “utf8”编解码器无法解码位置 183 中的字节 0xa0:无效的起始字节

有些查询有效,有些则无效。根据我的研究,我发现 SQL Server 不支持 UTF-8,这是我设置的。你知道我怎么知道在 SlashDB 数据库设置中将数据库字符集设置为什么吗?

我所知道的是数据库排序规则设置为SQL_Latin1_General_CP1_CI_AS

4

1 回答 1

1

解释:看起来不间断空格字符已写入纯文本字段(类型 VARCHAR 或 CHAR)。您的数据库的默认编码是拉丁语 1,但 SlashDB 配置为使用 utf-8 编解码器将该字符串解码为 Unicode。这是行不通的,因为这个字符的 utf-8 编码实际上是两个字节:C2 A0,而拉丁语 1 只有一个字节 A0。

In [38]: u'\xa0'.encode('utf-8')
Out[38]: '\xc2\xa0'

In [39]: u'\xa0'.encode('latin-1')
Out[39]: '\xa0'

In [40]: print '\xa0'.decode('latin-1')


In [41]: print '\xa0'.decode('utf-8')
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-41-018a073d68b8> in <module>()
----> 1 print '\xa0'.decode('utf-8')

D:\Victor\Anaconda2\lib\encodings\utf_8.pyc in decode(input, errors)
     14
     15 def decode(input, errors='strict'):
---> 16     return codecs.utf_8_decode(input, errors, True)
     17
     18 class IncrementalEncoder(codecs.IncrementalEncoder):

UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 0: invalid start byte

修复:您应该在 SlashDB 的配置中匹配数据库的编码。为此,请在 Configure -> Databases 下编辑您的数据库连接,并将字符编码更改为“latin-1”。然后循环连接。

建议:对于在常规 7 位 ASCII 之外可以预期国际字符或不可打印控制代码的字段,您可能需要考虑在数据库表中使用 Unicode 数据类型,例如 NCHAR 和 NVARCHAR。这些不需要解码,因为数据库驱动程序会将它们作为 Unicode 发送到 SlashDB。

于 2018-08-15T14:08:51.403 回答