【问题标题】:Function becomes case-sensitive on a different server函数在不同的服务器上区分大小写
【发布时间】:2015-01-02 12:03:30
【问题描述】:

我在mysql中创建了以下函数:

DELIMITER $$
CREATE FUNCTION fn_header_uploader_address(v_add varchar(500)) RETURNS bigint(20)
begin
DECLARE v_error bigint default 0;

    IF length(v_add) > 100 then
        set v_error = 110;  
    elseif v_add is null or v_add ='' then 
        set v_error=110;
    elseif v_add NOT REGEXP '^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$' then
        set v_error=110;
    end if;   
return v_error;

end$$
DELIMITER ;

如果我在本地(确定性/无确定性子句)上运行它,它会为以下语句返回零(有效电子邮件):

select fn_header_uploader_address('hello@gmail.com');

但是在将函数移动到新服务器时,这变得区分大小写! 所以现在

select fn_header_uploader_address('hello@gmail.com'); ---- error 110

有什么帮助吗?

编辑:

我已经使用以下命令比较了服务器:

show collation where collation like '%_c%' ;
show variables like '%version%';

【问题讨论】:

  • 可以用UPPER(v_add) NOT REGEXP '^[A- ...强制大小写吗?尝试使用SHOW CHARACTER SET 检查排序规则。
  • 感谢您的回复哈维。我可以使用upper(v_add),但我是mysql的新手。所以,我想了解为什么我在 2 个不同的服务器上得到不同的结果。
  • 感谢 harvey,即使您的回答解决了我的问题,我也无法将其标记为已回答。

标签: mysql regex configuration collation case-sensitive


【解决方案1】:

变化:

...
elseif v_add NOT REGEXP '^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$' then
...

或二进制:

...
elseif v_add NOT REGEXP '^[\x41-\x5a\x61-\x7a\x30-\x39\x2e\x2d\x5f\x25]+\x40[\x41-\x5a\x61-\x7a\x30-\x39\x2e\x2d]+\x2e[\x41-\x5a\x61-\x7a]{2,4}$' then
...

【讨论】:

  • 我添加了搜索的二进制变体。无论如何它应该可以工作。
  • 谢谢@Ruben。我已经尝试过您上面提到的正则表达式。但它无法拒绝以下格式的行。即使末尾有“.com”,正则表达式也接受行。选择 'tammy@dotcom' 而不是正则表达式 '^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4 }$';我必须尝试在“@”之后的正则表达式中强制使用“点”
猜你喜欢
  • 2020-05-05
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 2011-03-08
  • 2011-01-11
  • 1970-01-01
相关资源
最近更新 更多