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