首页 > 解决方案 > 在拉丁语数据库中将二进制 ID 与 == 进行比较时,如何避免 Ecto 匹配不正确?

问题描述

我的 Elixir Ecto MySQL 数据库遇到了问题。我们发现字符集是拉丁文,这可能是问题的一部分。

我在数据库中有一个对象,其 id: 字段设置为“3f0c7254-693f-4574-3f3f-256c3f3f5224”。如果我使用这个 Elixir 块对数据库进行查询以生成查询:

params
|> Enum.reduce(@schema, fn {k, v}, query ->
  where(query, [b], field(b, ^k) == ^v)
end)

我可以传递id: "b30c7254-69d1-4574-a489-256cd9c45224"给查询(作为参数),它会找到具有另一个 id 值的记录。现在,请注意两个字符串之间的区别在于存储的值包含多个“3f”实例,即“?”的 ASCII 值。并且搜索字符串中对应的“字符”为0x80或以上。所以我认为正在发生的事情是查询正在将“无效的拉丁字符”转换为 ASCII“?” 然后进行字符匹配。

为什么引号中的这些东西被视为字符的表示,而不是字符本身?

有没有办法避免这个问题?将数据库字符集更改为 UTF8 的唯一解决方案是什么?似乎数据库查询应该能够在任何字符集中工作。

该项目正在使用一些旧版本的东西,我们正在考虑升级有几个原因,但我希望能很快解决这个问题,因为问题的一般形式正在导致生产问题。

Elixir 1.7、Ecto 2.1.6、MariaEx 0.8.4

标签: mysqlelixirecto

解决方案


推荐阅读