MySQL在默认的排序规则下运行几乎所有的字符串比较...除了REPLACE
命令。我有一个不区分大小写的排序规则,需要运行一个不区分大小写的REPLACE
。有没有什么方法可以强制REPLACE
使用当前的排序规则,而不是总是进行区分大小写的比较?我愿意升级我的MySQL(目前运行5.1)以获得更多的功能...
mysql> charset utf8 collation utf8_unicode_ci;
Charset changed
mysql> select 'abc' like '%B%';
+------------------+
| 'abc' like '%B%' |
+------------------+
| 1 |
+------------------+
mysql> select replace('aAbBcC', 'a', 'f');
+-----------------------------+
| replace('aAbBcC', 'a', 'f') |
+-----------------------------+
| fAbBcC | <--- *NOT* 'ffbBcC'
+-----------------------------+
9条答案
按热度按时间5kgi1eie1#
如果
replace(lower())
不起作用,则需要创建another function.b4lqfgs42#
我的两分钱。
由于许多人已经从MySQL迁移到MariaDB,这些人将有一个新的函数
REGEXP_REPLACE
。使用它作为一个普通的替换,但模式是一个正则表达式。这是一个工作示例:
选项
(?i)
使所有后续匹配不区分大小写(如果像我一样放在模式的开头,那么所有匹配都不区分大小写)。有关详细信息,请参阅此处:https://mariadb.com/kb/en/mariadb/pcre/
编辑:从MySQL 8.0开始,您现在也可以使用
regexp_replace
函数,请参阅文档:https://dev.mysql.com/doc/refman/8.0/en/regexp.htmlcarvr3hs3#
fvox所讲的语音的替代功能。
小型测试:
答案:
New Kork
v1uwarro4#
对Luist的答案的这种修改允许人们用不同套管版本的针来替换针(两行变化)。
weylhg0b5#
我选择了http://pento.net/2009/02/15/case-insensitive-replace-for-mysql/(在fvox的答案中),它执行不区分大小写的搜索,并进行区分大小写的替换,而不改变搜索字符串中其他位置不受影响的字符的大小写。
注意,同一页下面的注解指出CHAR(255)应该改为VARCHAR(255)-这似乎对我来说也是必需的。
ahy6op9u6#
在前面的答案和pento.net链接中,
LOCATE()
的参数是小写的。这是对资源的浪费,因为LOCATE在缺省情况下不区分大小写:
您可以替换
WHILE Locate( LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE), last_occurency ) > 0 DO
与
WHILE Locate(REPLACE_THIS, REPLACE_WHERE, last_occurency ) > 0 DO
等等。
gc0ot86w7#
如果是“特殊”字符,则会出现意外行为:
给予
这是出乎意料的...因为我们只想更换Önot A
更诡异的是:
给予
哪一个是正确的结果...似乎与存储过程参数的编码有关...
v440hwme8#
当我需要替换时,我喜欢使用我创建的一个搜索和替换函数,而不用担心原始字符串或搜索字符串的大小写。如果你传入一个空的/null搜索字符串或null替换字符串,而不改变传入的字符串,这个例程会很快退出。我还添加了一个安全的倒计时,以防搜索继续循环。这样我们就不会永远陷入循环。如果您认为起始数字太低,请更改起始数字。
yruzcnhs9#
这个问题有点老了,但我遇到了同样的问题,给的答案不允许我完全解决它。
我希望结果保留原始字符串的大小写。
所以我对fvox提出的
replace_ci
函数做了一个小的修改:使用示例:
将返回:|被替换的||- -||EySQL语言|