几个月前,我有一个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
1条答案
按热度按时间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-likefn.REGEXP_LIKE(Word.word, '^[aeiou]+$', 'c')