【发布时间】:2020-11-17 21:14:06
【问题描述】:
我有一个电报机器人(Aiogram,Python),它连接到 PostgreSQL 数据库。
如果用户输入了某个用户名(西里尔文、俄文或乌克兰文),机器人应返回有关该用户的完整信息,并存储在数据库中。
问题是:当机器人查询数据库时,用户名例如“Сергій”,它什么也不返回,尽管数据库中存在信息。
SELECT *
FROM users
WHERE username = 'Сергій';
我发现问题出在“c”或“i”之类的符号中,它们看起来很相似,但在 UTF-8 中具有不同的十六进制代码。如果我们以这种方式更改查询,一切正常
SELECT *
FROM users
WHERE username LIKE '_ерг_й';
我已经将数据库编码更改为 UTF-8,但还是有这个问题。 如果我直接从数据库中复制用户名并将其粘贴到机器人的输入字段中 - 它可以工作。
这是我的代码的主要片段:
@dp.message_handler()
async def username_input_handler(message: Message):
username = message.text
answer_text = await db.search_by_username(username)
await message.answer(text=answer_text)
# database class
class Database():
...
async def search_by_username(username):
query = "SELECT * FROM users WHERE username LIKE $1"
user = await self.pool.execute(query, username)
return user
...
更新:
仅当我查询“用户”表时才会出现问题。此表的数据是从 .txt 文件导入的。
对另一个表运行相同的查询可以正常工作。
【问题讨论】:
-
尝试一个国家字符文字,
N'Сергій'。 -
@jarlh,它没有效果。我试图通过控制台直接查询数据库,添加了 N 前缀。我想,这可能是我的数据库文件如何填充的问题。例如,在格式化源用户文件的过程中可能发生错误,并且诸如“c”或“i”之类的字母(在英语和乌克兰语中相似)被编码错误。有可能吗?
标签: python sql postgresql python-telegram-bot