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
。1
mysql>
select
ASCII(
'2'
);
2
-> 50
3
mysql>
select
ASCII(2);
4
-> 50
5
mysql>
select
ASCII(
'dx'
);
6
-> 100
也可参见ORD()函数。
ORD(str)
- 如果字符串str最左面字符是一个多字节字符,通过以格式
((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]
返回字符的ASCII代码值来返回多字节字符代码。如果最左面的字符不是一个多字节字符。返回与ASCII()
函数返回的相同值。1
mysql>
select
ORD(
'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位点精度工作。1
mysql>
select
CONV(
"a"
,16,2);
2
->
'1010'
3
mysql>
select
CONV(
"6E"
,18,8);
4
->
'172'
5
mysql>
select
CONV(-17,10,-18);
6
->
'-H'
7
mysql>
select
CONV(10+
"10"
+
'10'
+0xa,10,10);
8
->
'40'
BIN(N)
- 返回二进制值
N
的一个字符串表示,在此N
是一个长整数(BIGINT
)数字,这等价于CONV(N,10,2)
。如果N
是NULL
,返回NULL
。1
mysql>
select
BIN(12);
2
->
'1100'
OCT(N)
- 返回八进制值
N
的一个字符串的表示,在此N
是一个长整型数字,这等价于CONV(N,10,8)
。如果N
是NULL,返回NULL
。1
mysql>
select
OCT(12);
2
->
'14'
HEX(N)
- 返回十六进制值
N
一个字符串的表示,在此N
是一个长整型(BIGINT
)数字,这等价于CONV(N,10,16)
。如果N
是NULL
,返回NULL
。1
mysql>
select
HEX(255);
2
->
'FF'
CHAR(N,...)
-
CHAR()
将参数解释为整数并且返回由这些整数的ASCII代码字符组成的一个字符串。NULL
值被跳过。1
mysql>
select
CHAR
(77,121,83,81,
'76'
);
2
->
'MySQL'
3
mysql>
select
CHAR
(77,77.3,
'77.3'
);
4
->
'MMM'
CONCAT(str1,str2,...)
- 返回来自于参数连结的字符串。如果任何参数是
NULL
,返回NULL
。可以有超过2个的参数。一个数字参数被变换为等价的字符串形式。1
mysql>
select
CONCAT(
'My'
,
'S'
,
'QL'
);
2
->
'MySQL'
3
mysql>
select
CONCAT(
'My'
,
NULL
,
'QL'
);
4
->
NULL
5
mysql>
select
CONCAT(14.3);
6
->
'14.3'
LENGTH(str)
OCTET_LENGTH(str)
CHAR_LENGTH(str)
CHARACTER_LENGTH(str)
- 返回字符串
str
的长度。1
mysql>
select
LENGTH(
'text'
);
2
-> 4
3
mysql>
select
OCTET_LENGTH(
'text'
);
4
-> 4
注意,对于多字节字符,其CHAR_LENGTH()仅计算一次。
LOCATE(substr,str)
POSITION(substr IN str)
- 返回子串
substr
在字符串str
第一个出现的位置,如果substr
不是在str
里面,返回0
.1
mysql>
select
LOCATE(
'bar'
,
'foobarbar'
);
2
-> 4
3
mysql>
select
LOCATE(
'xbar'
,
'foobar'
);
4
-> 0
1
该函数是多字节可靠的。
LOCATE(substr,str,pos)
- 返回子串
substr
在字符串str
第一个出现的位置,从位置pos
开始。如果substr
不是在str
里面,返回0
。1
mysql>
select
LOCATE(
'bar'
,
'foobarbar'
,5);
2
-> 7
这函数是多字节可靠的。
INSTR(str,substr)
- 返回子串
substr
在字符串str
中的第一个出现的位置。这与有2个参数形式的LOCATE()
相同,除了参数被颠倒。1
mysql>
select
INSTR(
'foobarbar'
,
'bar'
);
2
-> 4
3
mysql>
select
INSTR(
'xbar'
,
'foobar'
);
4
-> 0
这函数是多字节可靠的。
LPAD(str,len,padstr)
- 返回字符串
str
,左面用字符串padstr
填补直到str
是len
个字符长。1
mysql>
select
LPAD(
'hi'
,4,
'??'
);
2
->
RPAD(str,len,padstr)
- 返回字符串
str
,右面用字符串padstr
填补直到str
是len
个字符长。1
mysql>
select
RPAD(
'hi'
,5,
'?'
);
2
->
'hi???'
LEFT(str,len)
- 返回字符串
str
的最左面len
个字符。1
mysql>
select
LEFT
(
'foobarbar'
, 5);
2
->
'fooba'
该函数是多字节可靠的。
RIGHT(str,len)
- 返回字符串
str
的最右面len
个字符。
1
mysql>
select
RIGHT
(
'foobarbar'
, 4);
2
->
'rbar'
该函数是多字节可靠的。
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
MID(str,pos,len)
- 从字符串
str
返回一个len
个字符的子串,从位置pos
开始。使用FROM
的变种形式是ANSI SQL92语法。1
mysql>
select
SUBSTRING
(
'Quadratically'
,5,6);
2
->
'ratica'
该函数是多字节可靠的。
SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
- 从字符串
str
的起始位置pos
返回一个子串。1
mysql>
select
SUBSTRING
(
'Quadratically'
,5);
2
->
'ratically'
3
mysql>
select
SUBSTRING
(
'foobarbar'
FROM
4);
4
->
'barbar'