mysql 要怎样使用正则表达式查询带有日文假名的字段?

image.png
如图所示,我试图使用正则表达式查询title中含有日文平假名和片假名的数据。
但是除了预期的数据,还会查到不含平假名及片假名的数据。
反过来使用not REGEXP查询不含平假名和片假名的title,只能查找到仅有英文+数字的数据。
另外,我把不含平假名和片假名的title复制出来,使用其他工具(如sublime text)进行正则表达式匹配,则不能匹配到平假名和片假名。
求问到底该怎么查找?图中的正则表达式是否有错?

阅读 3.1k
3 个回答

好吧,写了个函数实现了需求。

CREATE DEFINER=`wq19bar`@`%` FUNCTION `jp_char_inside`(s text) RETURNS int(11)
BEGIN
    declare h text;
    declare p integer;
    declare l integer;
    declare head text;
    declare utf_8 text;
    set h = hex(s);
    set p = 1;
    set l = length(h);
    while p <= l do
        set head = substr(h, p, 1);
        if head < '8' then
            set p = p + 2;
        else
            set utf_8 = substr(h, p, 6);
            if (utf_8 >= 'E38181' and utf_8 <= 'E3829E') then
                return 1;
            end if;
            if (utf_8 >= 'E382A1' and utf_8 <= 'E383BE') then
                return 1;
            end if;
            set p = p + 6;
        end if;
    end while;
RETURN 0;
END

看搜索, 日文中的假名字符是有限数量的吧, 一共才100多个. 把字符全列出来当正则.

奇了怪了,我试下来结果如下:

select "詳" regexp "[ど]"; -- 为真,居然能匹配上
select "詳" regexp "ど"; -- 为假,这个是对的

于是,题主说自己采用过枚举法并且结果还不对,那么只能猜测Mysql可能有bug以至于加中括号就有问题,枚举只能这么来:

select "詳" regexp "ぁ|あ|ぃ|い|ぅ|う|ぇ|え|ぉ|お|か|が|き|ぎ|く|ぐ|け|げ|こ|ご|さ|ざ|し|じ|す|ず|せ|ぜ|そ|ぞ|た|だ|ち|ぢ|っ|つ|づ|て|で|と|ど|な|に|ぬ|ね|の|は|ば|ぱ|ひ|び|ぴ|ふ|ぶ|ぷ|へ|べ|ぺ|ほ|ぼ|ぽ|ま|み|む|め|も|ゃ|や|ゅ|ゆ|ょ|よ|ら|り|る|れ|ろ|ゎ|わ|ゐ|ゑ|を|ん" --片假名题主自己列一下吧

才疏学浅,希望能帮助到你。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏