模拟 mysql utf8_general_ci collaction

Simulate mysql utf8_general_ci collaction

提问人:Simeon Borisov 提问时间:2/12/2021 更新时间:2/28/2021 访问量:60

问:

我正在尝试将 javascript 应用程序与在数据库中创建名称的第三方 API 集成。我的问题是第三方应用程序使用utf8_general_ci排序规则来确定名称的唯一性,在我的应用程序中,我需要动态决定我要发送的名称是否已经存在于他们的数据库中,以防止重复名称错误。基本上流程是这样的:

  1. 我的应用程序接受用户输入的名称:“somename”

  2. 我的应用程序对第三方 API 执行“somename”的搜索请求,该请求返回:

[
  {
    "id": 1,
    "name": "Somënamë"
  },
  {
    "id": 2,
    "name": "somename somesecondname"
  },
  {
    "id": 3,
    "name": "somename someothername"
  }
]

  1. 我的应用程序需要确定我是否应该创建一个新记录“somename”或重用其中一个结果

在这种情况下,我的应用程序需要确定“somename”和“Somënamë”在utf8_general_ci比较中是相等的,并且应该使用 id=1 的记录,而不是尝试创建新记录(这将导致重复的名称)

基本上,我需要执行与第三方数据库相同的字符串比较

我尝试过的一个选项实际上是使用 mysql 实例来检查它,例如

SELECT IF(_utf8:string1 COLLATE utf8_general_ci = _utf8:string2 COLLATE utf8_general_ci, "true", "false") as equals;

但对于我的情况来说,这太耗费资源了,我们可能会有成千上万的结果。

有没有办法至少半准确地在 javascript 中模拟这种排序规则检查,而不必在我这边使用数据库?

JavaScript MySQL 字符串 比较 排序规则

评论


答:

0赞 Rick James 2/28/2021 #1

我建议你工作太辛苦了。

如果列和连接被声明为 ,则 = 因为表示大小写折叠和重音剥离。COLLATION utf8_general_ciSomënamësomename_ci

有列 .无需执行 ,只需检查 上的 dup 键错误。UNIQUESELECTINSERT

评论

0赞 Simeon Borisov 3/1/2021
嘿,谢谢你的回复!就我而言,该列位于我正在创建/更新/删除记录的第三方数据库中,在发送 CREATE 请求之前,我需要检查该排序规则中的某些内容是否匹配。基本上,我首先对数据库执行一个松散的搜索请求,在我实际发送请求之前,我需要在我的应用程序中检查其中一个搜索结果是否与我想在utf8_general_ci中创建的内容匹配。例如,我需要在我的 javascript 应用程序中对项目列表执行该utf8_general_ci。UNIQUE
0赞 Simeon Borisov 3/1/2021
现在作为一种解决方案,我只是在 javascript 中对我的所有字符串进行大小写折叠和重音剥离并以这种方式进行比较,但我想知道我是否需要做任何其他事情来匹配排序规则检查 SQL 将要做的事情?
0赞 Rick James 3/2/2021
@SimeonBorisov - 如果排序规则不匹配,则不使用索引。如果您已经进行了外壳折叠和口音剥离,这并不重要;它会很慢。