linux上执行java程序,从mysql中查出来的结果,不管怎么编码都是乱码,崩溃了。
先看mysql的设置,
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 在mysql控制台,现在有一个表,直接select出来是乱码,设置character_set_results=utf8之后得到是正常中文。
可是我在java程序中,select出来做一次,ISO-8859-1到utf8的字符转换,得到的还是乱码。无解了,大家看看问题出在哪?
先看mysql的设置,
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 在mysql控制台,现在有一个表,直接select出来是乱码,设置character_set_results=utf8之后得到是正常中文。
可是我在java程序中,select出来做一次,ISO-8859-1到utf8的字符转换,得到的还是乱码。无解了,大家看看问题出在哪?
因为用不了多长时间。在装到倒数第5 6步的时候有个选择数据库默认编码的下拉列表框。
先选择更改字符编码的单选按钮,然后在下拉框中选择UTF-8就行了。
只要统一了编码,就行了。
敢不敢有个不是重装mysql的人...
还有,有没有不需要修改mysql设置,不让mysql重启的方法。而是在程序中处理。
Connection con = DriverManager.getConnection(url, user, pass);
使用的是这种方式获取数据库连接,如何指定字符集呢?
default-character-set=xxx
default-character-set=xxx
把这两个字符集都改成和JVM一样的编码,然后重起mysql服务
对于这个问题我是这样看的,假如程序中有可以处理又不用重启的方法,那修改mysql设置何必要重启呢?
加上了,还是不好使呀!
有没有人能具体解释一下,各个编码设置是如何影响程序中的数据的。
比如character_set_connection=latin1,实在什么情况下用到这个设置?使用java api连接的mysql的时候,对从mysql得到的数据进行latin1的编码解释?
既然有这种设置,应该可以再程序中解决吧,请大家讨论讨论,能不能使用程序转换编码解决。
网上有很多说明怎么处理mysql乱码的问题,我都看过了。基本统一的就是说修改配置文件,把所有字符集都设成utf8,可是目前我不存在这种条件,不能更改设置,重启mysql,唯一的途径就是通过程序途径实现。
pass=""
url="jdbc:mysql://127.0.0.1:3306/testcharacterEncoding=gb2312&autoReconnect=true"
Connection con = DriverManager.getConnection(url, user, pass);自己试一下吧,我的mysql可以,不过用的是连接池URL如上,user,pass是自己的
pass=""
url="jdbc:mysql://127.0.0.1:3306/testcharacterEncoding=gb2312&autoReconnect=true"
Connection con = DriverManager.getConnection(url, user, pass);自己试一下吧,我的mysql可以,不过用的是连接池URL如上,user,pass是自己的
url=
"jdbc:mysql://127.0.0.1:3306/test?characterEncoding=gb2312&autoReconnect=true"
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8
存入的数据都是utf8编码的,直接用selec * from table_name 得到的结果由于character_set_results设置的是latin1,所以在控制台显示是乱码。不过只要设置set character_set_results=utf8,显示的都是正常的。
总之,数据没有问题,绝对都是utf8编码的数据,这个我可以保证。
理论上是没有问题,java不是也说一次编译处处运行吗!但是我前几天看到有人在别的帖子回复说,有时会有问题,最好重新编译一下!具体怎么回事我也不知道。
难道就没有人对字符集的问题有比较透彻的理解吗?看了javaeye上的文章,感觉说的都好模糊。
既然是一个映射,那你能根据各个字符集的设置,详细描述一下整个过程做了哪些字符集的映射吗?
例如,我的mysql设置如下
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8
现在数据库有个表A,字段为id int(11),name(varchar(20),出入一条数据,(1,张三),存入的数据字符编码是utf8的。那么现在我通过jdbc的api,连接并查询数据。SQL语句为
select * from A
那么整个过程中都涉及了哪些字符集所做的映射?
说明下,jdbc连接的时候,url指定了encoding=utf8;
但粗略地应该知道,数据库中数据存储至少有个映射规则吧,比如对应character_set_database连接时如果有跨网络数据传输,客户端显示字符需要一个映射规则吧
如果仅仅是select,用的可以是数据库编码
我以前遇到过,不用重装mysql,就是在建库的时候有个字符集选择的地方,然后把表倒过去。
应该来说可以直接在java中写代码用于转换字符编码的