mysql 的编码比较麻烦,他的编码有好几层:字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。
连接级如果不指定编码则为latin1编码。
服务器级、数据库级、表级 这三级中如果服务器级没加特别的设置的话那他默认是latin1编码的,以后在建库见表都是默认latin1编码
当然 三个级别不一定编码要一样,可以服务器是latin1 ,数据库是gb2312 ,表是utf-8
一般来说:表的编码默认=库的编码默认=服务器编码。当然如果服务器编码为latin1,然而在建库的时候指定编码为gb2312,那么再建表的时候
如果不指定编码则默认=库的编码 为gb2312,即默认为最邻近的上层编码 。
如果表的编码为gb2312,那当用jdbc连库时应该在建connction时这样写:
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test3?user=root&password=123456&useUnicode=true&characterEncoding=GB2312");
指定连接编码为gb2312,则如果是java string 是中文的话,那么无需进行编码转化即可正确写入表中。
如果表的编码为latin1,那么jdbc连库时应该在建connction时这样写:
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test3?user=root&password=123456");
即用默认的latin1编码连接数据库,然而如果string 是中文的话必须进行编码转化:
pstm.setString(1, new String(info.getCity().getBytes("gb2312"),"iso8859-1"));
也即是说表的编码是什么就应该以什么样的编码去链接库。如果表的编码不支持中文(如:latin1)写库和读库则要进行编码转化,如果支持中文(如:gb2312)不用进行编码转化只需在连库的时候指定正确的编码。
另外注意:如果表的编码为gb2312等(非latin1),在mysql 客户端或控制台,察看表内容时:一定要先指定连接编码为表的编码,如:gb2312等。 指定的语句如下 :SET CHARACTER SET gb2312;这样才能保证,看到的不是乱码,否则即使在表中的数据存储的时正确的,如果察看时没有指定正确的连接编码,则也会看到乱码,使自己产生错误的判断。尤其是在liunx下察看时,默认连接编码一般都是latin1,如果表的编码为gb2312,则就会看到乱码,所以一定要指定连接编码。