MySQL编码问题导致含中文字段无法进行删除操作

今天碰到一个十分诡异的事情,在进行delte操作的时候出现数据删除不掉的问题,写一篇博客记录下来,避免再次踩坑。

抛出问题

因为是一个自己弄得一个很小的测试程序的后台,所以没有使用当下流行的Spring框架以及MyBatis,在开发一个删除数据库字段接口的时候发现接口没有报任何错误,但是查询的结果是没有删除成功[这里的字段是包含中文的],贴下代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		Connection connection = null;
		Statement statement = null;
		String sql;

		response.setContentType("text/json;charset=UTF-8");
		PrintWriter out = response.getWriter();

		JSONObject jsonObject = new JSONObject();
		String originTitle = request.getParameter("originTitle");
		String originRunner = request.getParameter("originRunner");
		System.out.println("originTitle:" + originTitle + "/originRunner:" + originRunner);

		try {
			// 注册 JDBC 驱动器
			Class.forName("com.mysql.jdbc.Driver");

			// 打开一个连接
			connection = DriverManager.getConnection(Constans.DB_URL, Constans.USER, Constans.PASS);

			// 执行 SQL
			statement = connection.createStatement();
			sql = "DELETE FROM daniel.`group` WHERE daniel.`group`.title = '" + originTitle
					+ "' AND daniel.`group`.runner = '" + originRunner + "'";
			statement.execute(sql);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 输出数据
			out.println(jsonObject.toJSONString());
			try {
				// 完成后关闭
				statement.close();
				connection.close();
			} catch (SQLException exception) {
				exception.printStackTrace();
			}
		}

	}

由于删除不了,我特地把这份代码放入main方法中单独去在自己本地数据库中测试,由于但是为了简便,测试数据都是用abc之类简单的字母,发现是可以进行删除操作的,这说明代码是没有问题的,于是我把眼光放在了数据库上面,是数据库哪里的设置,于是我多次在本地数据库和线上数据库反复测试,最后发现是中文字段导致的[这中间多少坎坷想必大家都懂],线上的数据库是可以删除不带中文字段的,于是我首先就想到了编码问题。

问题原因

简单来说就是IDE和MySql的编码不一致导致的,我们的IDE一般默认UTF-8,我们登上mysql后键入show variables like 'character%';命令查看编码:

mysql>  show variables like 'character%';                    
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     | 
| character_set_connection | latin1                     | 
| character_set_database   | utf8                       | 
| character_set_filesystem | binary                     | 
| character_set_results    | latin1                     | 
| character_set_server     | gbk                        | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /u01/mysql/share/charsets/ | 
+--------------------------+----------------------------+

发现数据库默认编码不是utf-8,找到了原因就好办了,噼里啪啦网上一搜,找到了一个行之有效的办法,就是修改mysql配置文件my.cnf,配置一下它的默认编码就好了。
在配置文件结尾添加以下配置:

character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

为避免加错位置,这里贴出我这边修改后的配置文件内容
MySQL编码问题导致含中文字段无法进行删除操作_第1张图片

配置完成后重启mysql,service mysqld restart[这里是以阿里云为例的],再次进入mysql,键入上述命令show variables like 'character%';发现:

mysql> show variables like 'character%';  
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

配置已经生效了,再次调用上述接口发现删除成功了。

你可能感兴趣的:(Java)