mysql - 在拉丁语数据库中将二进制 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
解决方案
推荐阅读
- html - 页脚底部内容不会粘在底部
- python-3.x - 如何使用 psycopg2 将数据插入 postgres 数据库
- android - 获取列表
> 平面图操作后 - node.js - 我无法在购物车路由器中填充该项目。item 是 ItemModel 的实例
- dataweave - Dataweave 替换使用 with do
- javascript - 如何使用 VueJS Vuetify Grid 将组件放在两列上?
- java - Java - 是否围绕建议停止执行
- node.js - nodejs zlib中的内存泄漏
- openam - OpenAM 14.5.1 登录
- python-3.x - Qwiic BME280 压力读数太高?