我熟悉不同的MySQL排序规则,我的数据库当前设置为UTF8_general_ci,并且我使用UTF8_unicode_ci进行了半成功的搜索。我正在运行MySQL5.6,我不能使用最新的排序规则,而不是在升级时感到头疼。
我说半成功,因为在使用UTF8_unicode_ci时ご返回こ;如果我能解决下面的大问题,我可以接受这一点。
我试图实现的是搜索我的城市列并返回一行,这样"Yokohama“和"横浜”以及よこはま和ヨコハマ都会在查询DB时返回同一行。这个是可能的吗?
发布于 2018-07-24 13:11:30
这是一个困难的问题,我怀疑您不能仅仅使用MySQL轻松地解决它。
有一个名为Migemo的程序,它在不同的上下文中在一定程度上解决了这个问题。它生成一个正则表达式,将未转换的输入与文档进行匹配。您可以看到一个带有output here的版本的在线演示。例如,输入"toukyou“的正则表达式为:
[とトト][うウウ][きキキ][ょョョ][うウウ]|とうきょう|当協会|東京|東教|toukyou|([tţťŧŢŤŦ]|t[¸ˇ-])([oòóôõöøǿōŏőǒǫǭÒÓÔÕÖØǾŌŎŐǑǪǬ]|o([ˋ`ˊ´ˆ^˜~¨/ˉ¯˘˝ˇ˛]|/[ˊ´]|[ˊ´]/|˛[ˉ¯]|[ˉ¯]˛))([uùúûüũūŭůűųǔǖǘǚǜÙÚÛÜŨŪŬŮŰŲǓǕǗǙǛ]|u([ˋ`ˊ´ˆ^˜~¨˚°ˉ¯˘˛ˇ]|¨[ˉ¯]|[ˉ¯]¨|¨[ˊ´]|[ˊ´]¨|¨ˇ|ˇ¨|¨[ˋ`]|[ˋ`]¨))([kķĸǩĶǨ]|k[¸ˇ])([yỳýÿŷỲÝŸŶ]|y[ˋ`ˊ´¨ˆ^])([oòóôõöøǿōŏőǒǫǭÒÓÔÕÖØǾŌŎŐǑǪǬ]|o([ˋ`ˊ´ˆ^˜~¨/ˉ¯˘˝ˇ˛]|/[ˊ´]|[ˊ´]/|˛[ˉ¯]|[ˉ¯]˛))([uùúûüũūŭůűųǔǖǘǚǜÙÚÛÜŨŪŬŮŰŲǓǕǗǙǛ]|u([ˋ`ˊ´ˆ^˜~¨˚°ˉ¯˘˛ˇ]|¨[ˉ¯]|[ˉ¯]¨|¨[ˊ´]|[ˊ´]¨|¨ˇ|ˇ¨|¨[ˋ`]|[ˋ`]¨))由于Migemo用于从部分非转换输入进行匹配,因此它需要ASCII输入,因此您不能按原样使用它。然而,Migemo的基本策略-将您的输入转换为匹配所有变体的正则表达式-可用于搜索您的MySQL数据库。
正如一位评论者提到的,如果你想支持带有特殊罗马字母的地名,这是很困难的;例如,你需要同时识别"Shinbashi“和"Shimbashi”吗?如果您只是使用平假名输入,即使是"Tokyo“也需要一个例外。为此,我建议您构建自己的列表,可能会使用romaji data from JP Post。它不会处理所有的变体,但它会得到标准的变体。
希望这能有所帮助。
发布于 2018-07-24 14:37:12
我过去使用过libkakasi,但我是在应用程序空间而不是数据库中进行整理的。
› echo -n '横浜' | kakasi -i utf8 -o utf8 -JH
よこはま
› echo -n 'ヨコハマ' | kakasi -i utf8 -o utf8 -KH
よこはま您可以首先将所有内容规范化为平假名,将这些字符串另外存储在数据库中,使用现有的Unicode排序规则对它们执行排序,当找到匹配时,取而代之的是相应的原始非规范化字符串。
https://stackoverflow.com/questions/51490342
复制相似问题