使用 SQL 服务器的 SlashDB 中的 UTF8 错误
UTF8 Error in SlashDB using SQL Server
我正在使用 SQL 服务器和 SlashDB。它一直运行良好。今天发生错误,可能是说我定义了错误的数据库字符集。我收到此错误:
ValueError | 'utf8' codec can't decode byte 0xa0 in position 183: invalid start byte
有些查询有效,有些则无效。根据我的研究,我看到 SQL 服务器不支持 UTF-8,这是我设置的。您知道我如何知道在 SlashDB 数据库设置中将数据库字符集设置为什么吗?
我只知道数据库排序规则设置为 SQL_Latin1_General_CP1_CI_AS
说明:看起来像一个不间断的 space 字符被写入纯文本字段(类型 VARCHAR 或 CHAR)。您的数据库的默认编码是 Latin 1,但 SlashDB 配置为使用 utf-8 编解码器将该字符串解码为 Unicode。这是行不通的,因为这个字符的 utf-8 编码实际上是两个字节:C2 A0,而对于 Latin 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"。然后循环连接。
建议:对于可能需要国际字符或非原则 table 常规 7 位 ASCII 之外的控制代码的字段,您可能需要考虑使用 Unicode 数据在数据库 table 中输入 NCHAR 和 NVARCHAR 等类型。这些不需要解码,因为数据库驱动程序会将它们作为 Unicode 发送到 SlashDB。
我正在使用 SQL 服务器和 SlashDB。它一直运行良好。今天发生错误,可能是说我定义了错误的数据库字符集。我收到此错误:
ValueError | 'utf8' codec can't decode byte 0xa0 in position 183: invalid start byte
有些查询有效,有些则无效。根据我的研究,我看到 SQL 服务器不支持 UTF-8,这是我设置的。您知道我如何知道在 SlashDB 数据库设置中将数据库字符集设置为什么吗?
我只知道数据库排序规则设置为 SQL_Latin1_General_CP1_CI_AS
说明:看起来像一个不间断的 space 字符被写入纯文本字段(类型 VARCHAR 或 CHAR)。您的数据库的默认编码是 Latin 1,但 SlashDB 配置为使用 utf-8 编解码器将该字符串解码为 Unicode。这是行不通的,因为这个字符的 utf-8 编码实际上是两个字节:C2 A0,而对于 Latin 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"。然后循环连接。
建议:对于可能需要国际字符或非原则 table 常规 7 位 ASCII 之外的控制代码的字段,您可能需要考虑使用 Unicode 数据在数据库 table 中输入 NCHAR 和 NVARCHAR 等类型。这些不需要解码,因为数据库驱动程序会将它们作为 Unicode 发送到 SlashDB。