mysql用户定义函数字符集的问题
我试图创建一个mysql函数,对字符串进行操作。每个字符都是通过向其ascii值中添加一个数字(使其成为另一个字符)然后再次将其合并为字符串来更改的 在php上执行此操作-所有操作都很好,每个字符的值都小于256 在mysql上执行此操作-每个字符的值都超过50000 字段为utf-8 有什么想法吗 mysql代码:mysql用户定义函数字符集的问题,mysql,Mysql,我试图创建一个mysql函数,对字符串进行操作。每个字符都是通过向其ascii值中添加一个数字(使其成为另一个字符)然后再次将其合并为字符串来更改的 在php上执行此操作-所有操作都很好,每个字符的值都小于256 在mysql上执行此操作-每个字符的值都超过50000 字段为utf-8 有什么想法吗 mysql代码: DROP FUNCTION IF EXISTS wizner_denc; DELIMITER $$ CREATE FUNCTION wizner_denc(code TEXT,ci
DROP FUNCTION IF EXISTS wizner_denc;
DELIMITER $$
CREATE FUNCTION wizner_denc(code TEXT,ciper TEXT)
RETURNS TEXT CHARSET utf8 READS SQL DATA
BEGIN
DECLARE enc_str TEXT;
DECLARE kk INT;
DECLARE kmax INT;
DECLARE cc TEXT;
DECLARE stp TEXT;
DECLARE cmax INT;
DECLARE code_idx INT;
SET enc_str=CHARSET(ciper);
SET code_idx = 1;
SET kk = 1;
SET kmax=LENGTH(ciper);
SET cmax=LENGTH(code);
WHILE (kk < kmax) DO
SET cc=ORD(SUBSTRING(ciper,kk,1));
SET stp = SUBSTRING(code, code_idx, 1);
SET cc=cc-stp;
IF cc <= 0 THEN
SET cc=250+cc;
END IF;
SET enc_str=CONCAT(enc_str,'...cc=',cc,'...stp=',stp,'|||');
SET enc_str=CONCAT(enc_str,CHAR(cc));
SET code_idx=code_idx+1;
IF code_idx >= cmax THEN
SET code_idx=1;
END IF;
SET kk = kk + 1;
END WHILE;
RETURN enc_str;
END;
$$
DELIMITER ;
SET NAMES utf8;
SELECT wizner_denc('232323',CONVERT(address USING utf8)),address FROM `demo_clients_tbl` WHERE 1
在php中,我看到了以下数字:
... cc-217 stp=2
... cc-147 stp=3
... cc-217 stp=2
... cc-172 stp=3
... cc-217 stp=2
... cc-154 stp=3
... cc-217 stp=2
... cc-171 stp=3
对于DB上的同一行,我找到了它。
在mysql中,非英语字母是2个字节,它们组合在一起(即55697),而在php中则是一个字节接一个字节。
因此,我将mysql回复转换为2个数字,并进行了与php相同的操作。
请注意,对于英文字母,没有必要这样做(回复将小于256)显然,“向其ascii值添加一个数字”和“字段为utf-8”不能很好地混合。顺便说一句,看起来你正在尝试实现你自己形式的(非常基本的)“加密”。。。您应该使用已经实现的加密函数之一。您是对的,我正在创建自己的加密。移动到已经实现的功能不是一个选项
... cc-217 stp=2
... cc-147 stp=3
... cc-217 stp=2
... cc-172 stp=3
... cc-217 stp=2
... cc-154 stp=3
... cc-217 stp=2
... cc-171 stp=3