MYSQL转换编码的解决方法
一、在utf8的mysql下
得到中文‘游客’的gbk下的16进制编码
mysql> SELECT hex(CONVERT( \'游客\' USING gbk ));
-> D3CEBFCD
反推gbk的16进制编码,取回中文
mysql> SELECT CONVERT( unhex(\'d3cebfcd\') USING gbk);
-> ’游客\'
从gbk的16进制编码直接转成utf8的16进制编码
mysql> SELECT HEX(CONVERT(CONVERT( unhex(\'d3cebfcd\') USING gbk) USING utf8));
-> \'E6B8B8E5AEA2\'
二、如果在gbk的mysql环境下
得到中文‘游客’的gbk下的16进制编码
mysql> SELECT hex(\'游客\');
-> D3CEBFCD
反推gbk的16进制编码,取回中文
mysql> unhex(\'d3cebfcd\') ;
-> ’游客\'
原理知道了,就可以写个小程序来替换进行转编码了。不过特别提醒在文本里16进制必须在头部加上0x,例如:0xD3CEBFCD才能正常使用。
MySql的字符串函数
ASCII(str)-
返回字符串
str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL。1mysql>selectASCII(\'2\');2-> 503mysql>selectASCII(2);4-> 505mysql>selectASCII(\'dx\');6-> 100 ORD(str)- 如果字符串str最左面字符是一个多字节字符,通过以格式
((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]返回字符的ASCII代码值来返回多字节字符代码。如果最左面的字符不是一个多字节字符。返回与ASCII()函数返回的相同值。1mysql>selectORD(\'2\');2-> 50 CONV(N,from_base,to_base)- 在不同的数字基之间变换数字。返回数字
N的字符串数字,从from_base基变换为to_base基,如果任何参数是NULL,返回NULL。参数N解释为一个整数,但是可以指定为一个整数或一个字符串。最小基是2且最大的基是36。如果to_base是一个负数,N被认为是一个有符号数,否则,N被当作无符号数。CONV以64位点精度工作。1mysql>selectCONV("a",16,2);2->\'1010\'3mysql>selectCONV("6E",18,8);4->\'172\'5mysql>selectCONV(-17,10,-18);6->\'-H\'7mysql>selectCONV(10+"10"+\'10\'+0xa,10,10);8->\'40\' BIN(N)- 返回二进制值
N的一个字符串表示,在此N是一个长整数(BIGINT)数字,这等价于CONV(N,10,2)。如果N是NULL,返回NULL。1mysql>selectBIN(12);2->\'1100\' OCT(N)- 返回八进制值
N的一个字符串的表示,在此N是一个长整型数字,这等价于CONV(N,10,8)。如果N是NULL,返回NULL。1mysql>selectOCT(12);2->\'14\' HEX(N)- 返回十六进制值
N一个字符串的表示,在此N是一个长整型(BIGINT)数字,这等价于CONV(N,10,16)。如果N是NULL,返回NULL。1mysql>selectHEX(255);2->\'FF\' CHAR(N,...)-
CHAR()将参数解释为整数并且返回由这些整数的ASCII代码字符组成的一个字符串。NULL值被跳过。1mysql>selectCHAR(77,121,83,81,\'76\');2->\'MySQL\'3mysql>selectCHAR(77,77.3,\'77.3\');4->\'MMM\' CONCAT(str1,str2,...)- 返回来自于参数连结的字符串。如果任何参数是
NULL,返回NULL。可以有超过2个的参数。一个数字参数被变换为等价的字符串形式。1mysql>selectCONCAT(\'My\',\'S\',\'QL\');2->\'MySQL\'3mysql>selectCONCAT(\'My\',NULL,\'QL\');4->NULL5mysql>selectCONCAT(14.3);6->\'14.3\' LENGTH(str)OCTET_LENGTH(str)CHAR_LENGTH(str)CHARACTER_LENGTH(str)- 返回字符串
str的长度。1mysql>selectLENGTH(\'text\');2-> 43mysql>selectOCTET_LENGTH(\'text\');4-> 4 LOCATE(substr,str)POSITION(substr IN str)- 返回子串
substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0.1mysql>selectLOCATE(\'bar\',\'foobarbar\');2-> 43mysql>selectLOCATE(\'xbar\',\'foobar\');4-> 01该函数是多字节可靠的。 LOCATE(substr,str,pos)- 返回子串
substr在字符串str第一个出现的位置,从位置pos开始。如果substr不是在str里面,返回0。1mysql>selectLOCATE(\'bar\',\'foobarbar\',5);2-> 7 INSTR(str,substr)- 返回子串
substr在字符串str中的第一个出现的位置。这与有2个参数形式的LOCATE()相同,除了参数被颠倒。1mysql>selectINSTR(\'foobarbar\',\'bar\');2-> 43mysql>selectINSTR(\'xbar\',\'foobar\');4-> 0 LPAD(str,len,padstr)- 返回字符串
str,左面用字符串padstr填补直到str是len个字符长。1mysql>selectLPAD(\'hi\',4,\'??\');2-> RPAD(str,len,padstr)- 返回字符串
str,右面用字符串padstr填补直到str是len个字符长。1mysql>selectRPAD(\'hi\',5,\'?\');2->\'hi???\' LEFT(str,len)- 返回字符串
str的最左面len个字符。1mysql>selectLEFT(\'foobarbar\', 5);2->\'fooba\' RIGHT(str,len)- 返回字符串
str的最右面len个字符。1mysql>selectRIGHT(\'foobarbar\', 4);2->\'rbar\' SUBSTRING(str,pos,len)SUBSTRING(str FROM pos FOR len)MID(str,pos,len)- 从字符串
str返回一个len个字符的子串,从位置pos开始。使用FROM的变种形式是ANSI SQL92语法。1mysql>selectSUBSTRING(\'Quadratically\',5,6);2->\'ratica\' SUBSTRING(str,pos)SUBSTRING(str FROM pos)- 从字符串
str的起始位置pos返回一个子串。1mysql>selectSUBSTRING(\'Quadratically\',5);2->\'ratically\'3mysql>selectSUBSTRING(\'foobarbar\'FROM4);4->\'barbar\'