mysql peewee.OperationalError:(3995,“在调用regexp_like时,字符集'utf8mb4_unicode_ci'不能与'binary'一起使用,”)

kfgdxczn  于 2023-02-03  发布在  Mysql
关注(0)|答案(1)|浏览(616)

几个月前,我有一个peewee查询(针对mysql8.0服务器),现在它给了我以下错误:

peewee.OperationalError: (3995, "Character set 'utf8mb4_unicode_ci' cannot be used in conjunction with 'binary' in call to regexp_like.")

产生错误的代码行是:

words = (Word
         .select(Word.word, Word.points)
         .where(Word.word.regexp('^[aeiou]+$'))
         .order_by(fn.CHAR_LENGTH(Word.word).desc(), Word.word)

a)我有99%的把握它在几周内有效,B)我看不出我可能改变了什么,c)我很肯定解决方案会很简单,但我不能把我的手指放在它上面。
版本为peewee==3.15.4和Python==3.10.9

g52tjvyc

g52tjvyc1#

.regexp()转换为REGEXP BINARY操作。
在MySQL 8.0.22之前,可以在这些函数中使用二进制字符串参数,但它们产生的结果不一致。在MySQL 8.0.22和更高版本中,ER_CHARACTER_SET_MISMATCH拒绝在任何MySQL正则表达式函数中使用二进制字符串。
所以你可能应该把它转换成.iregexp(),它不使用这个结构:
Word.word.iregexp('^[aeiou]+$')
如果需要区分大小写,请使用fn.REGEXP_LIKE,它支持用于设置区分大小写的标志:https://dev.mysql.com/doc/refman/8.0/en/regexp.html#function_regexp-like
fn.REGEXP_LIKE(Word.word, '^[aeiou]+$', 'c')

相关问题