我需要将一些包含非ASCII字符的字符串插入数据库(Postgress)。这是最小的例子。我在<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.
答案 0 :(得分:4)
我想我遇到了同样的问题。应该使用与服务器相同的编码对数据进行编码。目前,您应该能够通过以下方式指定编码:
settings := DBXConnectionSettings
host: 'host.com'
port: '5432'
database: 'grss'
userName: 'username'
userPassword: 'password';
encodingStrategy: (DBXStaticEncoding newForEncoding: #utf8).
如果不知道编码,可以使用DBXAutomaticEncoding
代替DBXStaticEncoding
。
这应该适用于postgresql数据库。
答案 1 :(得分:1)
问题似乎是WideString。似乎FFI无法从WideString实例转换为C char *
你可以使用普通的ByteString代替宽吗?也许FFI可以修复,以便它可以做到吗?
答案 2 :(得分:1)
我仍然不知道如何在stackoverflow中回答某人。无论如何,Panu说应该有用:
settings := DBXConnectionSettings
host: 'host.com'
port: '5432'
database: 'grss'
userName: 'username'
userPassword: 'password';
encodingStrategy: (DBXStaticEncoding newForEncoding: #utf8).
无需使用直接使用UTF8TextConverter。这是用SqueakDBX做的方法。它与GlorpDBX无关,它只是简单的SqueakDBX。如果未更新最新的ConfigurationOfSqueakDBX,只需使用Monticello Browser更新到最新版本。
答案 3 :(得分:0)
FFI的char *想要一个ByteString。也许postgres可以直接使用UTF-8?如果是这样,你只需要说squeakToUtf8。
答案 4 :(得分:0)
使用
修复 UTF8TextConverter >> convertToSystemString
和
UTF8TextConverter >> convertFromSystemString