在mysql中对日语字符(汉字、平假名、片假名)进行排序

ejk8hzay  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(554)

我熟悉不同的mysql排序规则,我的db当前设置为utf8\u general\u ci,我使用utf8\u unicode\u ci搜索了半成功。我运行的是MySQL5.6,我不能使用最新的排序规则,升级时我会感到头痛。
我说半成功,就像ご 他回来了こ 使用utf8\u unicode\u ci时;如果我能解决下面的大问题,我可以接受。
我要做的是搜索我的城市专栏并返回一行,所以“横滨”和横浜" 以及よこはま 以及ヨコハマ 在查询数据库时都返回同一行。这可能吗?

3wabscal

3wabscal1#

我过去使用过libkakasi,不过我是在应用程序空间而不是数据库中进行整理的。

› echo -n '横浜' | kakasi -i utf8 -o utf8 -JH
よこはま
› echo -n 'ヨコハマ' | kakasi -i utf8 -o utf8 -KH
よこはま

您可以先将所有内容标准化为平假名,将这些字符串另外存储在数据库中,使用现有的unicode排序规则对它们执行排序,当找到匹配项时,取而代之的是相应的原始未标准化字符串。

z2acfund

z2acfund2#

这是一个困难的问题,我怀疑仅仅使用mysql很难解决它。
有一个叫做migemo的程序,它在不同的上下文中处理这个问题。它生成一个正则表达式,将未转换的输入与文档相匹配。你可以在这里看到一个版本的在线演示。例如,输入“toukyou”的正则表达式是:

[とトト][うウウ][きキキ][ょョョ][うウウ]|とうきょう|当協会|東京|東教|toukyou|([tţťŧŢŤŦ]|t[¸ˇ-])([oòóôõöøǿōŏőǒǫǭÒÓÔÕÖØǾŌŎŐǑǪǬ]|o([ˋ`ˊ´ˆ^˜~¨/ˉ¯˘˝ˇ˛]|/[ˊ´]|[ˊ´]/|˛[ˉ¯]|[ˉ¯]˛))([uùúûüũūŭůűųǔǖǘǚǜÙÚÛÜŨŪŬŮŰŲǓǕǗǙǛ]|u([ˋ`ˊ´ˆ^˜~¨˚°ˉ¯˘˛ˇ]|¨[ˉ¯]|[ˉ¯]¨|¨[ˊ´]|[ˊ´]¨|¨ˇ|ˇ¨|¨[ˋ`]|[ˋ`]¨))([kķĸǩĶǨ]|k[¸ˇ])([yỳýÿŷỲÝŸŶ]|y[ˋ`ˊ´¨ˆ^])([oòóôõöøǿōŏőǒǫǭÒÓÔÕÖØǾŌŎŐǑǪǬ]|o([ˋ`ˊ´ˆ^˜~¨/ˉ¯˘˝ˇ˛]|/[ˊ´]|[ˊ´]/|˛[ˉ¯]|[ˉ¯]˛))([uùúûüũūŭůűųǔǖǘǚǜÙÚÛÜŨŪŬŮŰŲǓǕǗǙǛ]|u([ˋ`ˊ´ˆ^˜~¨˚°ˉ¯˘˛ˇ]|¨[ˉ¯]|[ˉ¯]¨|¨[ˊ´]|[ˊ´]¨|¨ˇ|ˇ¨|¨[ˋ`]|[ˋ`]¨))

由于migemo用于从部分未转换的输入进行匹配,因此它需要ascii输入,所以不能按原样使用它。但是,migemo的基本策略-将输入转换为匹配所有变体的正则表达式-可以用于搜索mysql数据库。
正如一位评论者提到的,如果你想用特殊的罗马化来支持地名,这是很困难的;例如,你需要同时识别“shinbashi”和“shimbashi”吗?即使是“东京”也需要一个例外,如果你只是使用平假名输入。为此,我建议您构建自己的列表,可能使用jppost中的romaji数据。它不会处理所有的变化,但它会得到标准的。
希望有帮助。

相关问题