【问题标题】:Simulate mysql utf8_general_ci collaction模拟mysql utf8_general_ci 归类
【发布时间】:2021-02-12 13:56:54
【问题描述】:

我正在尝试将 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 string comparison collation


    【解决方案1】:

    我建议你工作太努力了。

    如果列和连接声明为COLLATION utf8_general_ci,则Somënamë = somename,因为_ci 表示大小写折叠和重音去除。

    拥有UNIQUE 列。不要执行SELECT,只需检查INSERT 上的复制密钥错误。

    【讨论】:

    • 您好,谢谢您的回复!在我的情况下,UNIQUE 列位于我正在创建/更新/删除记录的第三方数据库中,我需要在发送 CREATE 请求之前检查该排序规则中是否匹配。基本上,我首先对数据库进行松散的搜索请求,在我实际发送请求之前,我需要在我的应用程序中检查其中一个搜索结果是否与我想在 utf8_general_ci 中创建的内容匹配。例如。我需要在我的 javascript 应用程序中对项目列表执行该 utf8_general_ci。
    • 现在作为一种解决方案,我只是在 javascript 中对我的所有字符串进行大小写折叠和重音剥离并以这种方式进行比较,但我想知道是否需要做任何其他事情来匹配排序规则检查 SQL 会做什么?
    • @SimeonBorisov - 如果排序规则不匹配,则不使用索引。如果您已经完成了大小写折叠和重音剥离,则无关紧要;会很慢。
    猜你喜欢
    • 1970-01-01
    • 2011-03-09
    • 2018-01-19
    • 1970-01-01
    • 2015-12-11
    • 2011-06-13
    • 1970-01-01
    • 2013-09-15
    • 2012-03-01
    相关资源
    最近更新 更多