Mysql某个字段的编码导致的错误

数据库 May 27 2013


 今天客户反映了一个问题,某个审批操作导致了505错误,查看日志得出是某条数据插入时报错了,错误如下: org.springframework.jdbc.UncategorizedSQLException: Hibernate flushing: Could not execute JDBC batch update; uncategorized SQLException for SQL [insert into tms_station_his (address, area, area_feature, arrearage_limit, assure_terminal, cash_commission, city, comm_commission, control_type, create_date, deposit, develop_level, distance, grade, house_type, latitude, longitude, manage_type, manager, manager_mobile, manager_phone, near_station_id, opened_game, phone2, postcode, regarea, region_id, rent, responsible_id, responsor_manage, sale_commission, sta_type, station_group, status, ticket_addr, town, village, work_id, station_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; SQL state [HY000]; error code [1366]; Incorrect string value: '\xE5\xA0\xBD\xE8\xB7\xAF...' for column 'address' at row 1; nested exception is java.sql.BatchUpdateException: Incorrect string value: '\xE5\xA0\xBD\xE8\xB7\xAF...' for column 'address' at row 1

 查看生产环境中表tms_station_his在操作时插入字段address的数据为“南宁市长堽路三里广西公路技工学校对面”,可以看出里面有个生僻字“堽”,再查看生产环境中此表的字符集为gb2312,经查,此汉字在gb2312中确实不存在,于是基本确定是字符集的问题。将对应的字符集改为utf8,校对改为utf8_general_ci。即可解决此问题。如果用sql语句修改此表的所有字段的字符集,则命令如下:

ALTER TABLE `tms_station_his` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

总结:

 不过在修改过程中,忘了mysql数据库的特点:它的字符集的设置是由数据库服务器细分到数据库实例,再到表,最后到字段。

也就是说,即便将某个数据库实例或表的字符集统一改为了utf8,表中原有的字段却依然为gb2312,从而误以为自己的操作有误,甚至于怀疑自己遇到的问题并不是字符集的原因。所以一开始我也纠结了一下,最后想到address字段的字符集也要一并修改才最终解决此问题。

原文链接:http://ichatter.cn/mysql-e6-9f-90-e4-b8-aa-e5-ad-97-e6-ae-b5-e7-9a-84-e7-bc-96-e7-a0-81-e5-af-bc-e8-87-b4-e7-9a-84-e9-94-99-e8-af-af.html


欢迎来到阿J小虫的博客

Follow @ichatter on GitHub

最新评论

推荐内容