2014-11-06 78 views
1

我已經創建了下面這個函數在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._%-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$' then 
     set v_error=110; 
    end if; 
return v_error; 

end$$ 
DELIMITER ; 

如果我在本地(確定性/不確定性的條款)運行它,它返回零(有效的電子郵件)的以下聲明:

select fn_header_uploader_address('[email protected]'); 

但將功能移到新服務器,這變得區分大小寫! 所以現在

select fn_header_uploader_address('[email protected]'); ---- error 110 

請幫忙嗎?

編輯:

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

可以使用' UPPER(v_add)NOT REGEXP'^ [A- ...'強制案例;嘗試用'SHOW CHARACTER SET'檢查排序規則。 – harvey 2014-11-06 05:37:25

+0

感謝您的回覆哈維。我可以使用upper(v_add),但我是mysql新手。所以,我想了解爲什麼我在2臺不同的服務器上獲得不同的結果。 – Tammy 2014-11-06 07:52:02

+1

感謝哈維,儘管你的答案解決了我的問題,但我無法將其標記爲答案。 – Tammy 2014-12-10 07:30:58

回答

0

變化:

... 
elseif v_add NOT REGEXP '^[a-zA-Z0-9._%-][email protected][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 
... 
+0

我添加了搜索的二進制變體。無論如何,它應該工作。 – 2014-12-24 05:16:35

+0

感謝@Ruben。我已經嘗試了上面提到的正則表達式。但它無法拒絕以下格式的行。即使在末尾有'.com',正則表達式也會接受行。選擇'tammy @ dotcom'not regexp'^ [a-zA-Z0-9 ._% - ] + @ [a-zA-Z0-9 .-] + \。[a-zA-Z] {2,4 } $';我必須嘗試在'@' – Tammy 2014-12-24 05:31:08

+0

Thanks @Ruben之後在正則表達式中強制使用'點'。二進制版本的作品。 – Tammy 2014-12-24 05:39:02

相關問題