2

我需要在数据库(Postgress)中插入一些包含非 ASCII 字符的字符串。这是最小的示例。我在<cdecl: long 'odbx_query' (ulong char* ulong) module: 'opendbx'>. 据我了解,这是一个 FFI 错误,调用甚至没有到达数据库后端,但我不确定。

| conn settings sql |
settings :=     DBXConnectionSettings
                host: 'host.com'
                port: '5432'
                database: 'grss'
                userName: 'username'
                userPassword: 'password'.
conn := DBXConnection platform: DBXPostgresPlatform new settings: settings.
conn connectAndOpen.
sql := 'select ''', (WideString fromPacked: 269), ''' from dual'.
conn execute: sql.
conn close.
conn disconnect.
4

5 回答 5

4

我想我有同样的问题。应该使用与服务器相同的编码对数据进行编码。目前,您应该能够通过以下方式指定编码:

settings :=     DBXConnectionSettings
                host: 'host.com'
                port: '5432'
                database: 'grss'
                userName: 'username'
                userPassword: 'password';
                encodingStrategy: (DBXStaticEncoding newForEncoding: #utf8).

如果编码未知,可以使用DBXAutomaticEncoding而不是DBXStaticEncoding. 这应该适用于 postgresql 数据库。

于 2011-03-07T06:35:17.083 回答
1

问题似乎是WideString。FFI 似乎无法从 WideString 实例转换为 C char*

你能用普通的 ByteString 代替宽的吗?也许可以修复 FFI 以便它可以做到?

于 2011-03-06T20:54:08.407 回答
1

我仍然不知道如何在stackoverflow中回答某人。无论如何,帕努所说的应该有效:

settings :=     DBXConnectionSettings
                host: 'host.com'
                port: '5432'
                database: 'grss'
                userName: 'username'
                userPassword: 'password';
                encodingStrategy: (DBXStaticEncoding newForEncoding: #utf8).

无需直接使用 UTF8TextConverter。这就是使用 SqueakDBX 的方法。它与 GlorpDBX 无关,它只是普通的 SqueakDBX。如果最新的 ConfigurationOfSqueakDBX 没有更新,只需使用 Monticello 浏览器更新到最新版本即可。

于 2011-03-11T08:48:03.757 回答
0

通过使用修复

UTF8TextConverter >> convertToSystemString

UTF8TextConverter >> convertFromSystemString

于 2011-03-07T17:57:28.193 回答
0

FFI 的 char* 需要一个 ByteString。也许postgres可以直接使用UTF-8?如果是这样,您只需要说 squeakToUtf8。

于 2011-03-07T17:19:26.820 回答