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

时间:2018-07-24 04:10:18

标签: mysql unicode collation cjk kana

我熟悉不同的MySQL排序规则,我的数据库当前设置为UTF8_general_ci,并且使用UTF8_unicode_ci进行了半成功的搜索。我正在运行mysql 5.6,并且不能在没有升级麻烦的情况下使用最新的归类。

我说不成功,因为使用UTF8_unicode_ci时ご返回こ;如果我能解决以下重大问题,我可以接受。

我要实现的是搜索我的城市列并返回一行,因此“ Yokohama”和“横浜”以及よこはま和ヨコハヨコ在查询数据库时都返回同一行。这可能吗?

2 个答案:

答案 0 :(得分:1)

这是一个困难的问题,我怀疑您仅使用MySQL就无法轻松解决它。

有一个名为Migemo的程序可以在不同情况下在一定程度上处理此问题。它生成一个正则表达式以将未转换的输入匹配到文档。您可以看到一个输出为here的版本的在线演示。例如,输入“ toukyou”的正则表达式为:

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

由于Migemo用于匹配部分未转换的输入,因此它需要ASCII输入,因此您不能原样使用它。但是,Migemo的基本策略-将您的输入转换为匹配所有变体的正则表达式-可用于搜索MySQL数据库。

正如评论者所说,如果您想支持具有特殊罗马字风格的地名,这将非常困难;例如,您需要同时识别“新桥”和“新桥”吗?如果您仅使用平假名输入,甚至“东京”都需要例外。为此,我建议您构建自己的列表,并可能使用romaji data from JP Post。它不会处理所有变化,但会得到标准变化。

希望有帮助。

答案 1 :(得分:1)

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

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

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