mysql jdbc适用超过用户名最大长度(16个字符)

时间:2013-09-25 14:43:50

标签: java mysql jdbc username

我有一个主要用java编写的系统。该系统有一个简单的MySQL用户权限管理员。但现在我们开始与更多用户合作,用户名的长度现在超过16个字符。我修改了所有mysql系统表中的所有用户名长度属性。在Webmin和PhPMyAdmin中修改密码和表< =>用户关系正常工作。但是在这个java程序中,所有与长用户名相关联的操作都将被抛出SQLException,并带有消息:String' ...长用户名...'用户名太长(不应超过16)。

所以看起来问题出在jdbc中。如何强制在SQL操作中应用长用户名? (com.mysql.jdbc(5.1.24))

查询字符串:

st.execute("CREATE USER '"+user+"'@'localhost' IDENTIFIED BY 'nothing';");
st.execute("SET PASSWORD FOR '"+user+"'@'localhost' = PASSWORD('"+passwd+"');");

堆栈追踪:

java.sql.SQLException: String '...long username...' is too long for user name (should be no longer than 16)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.ja$
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2809)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2758)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:894)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:732)

2 个答案:

答案 0 :(得分:2)

如果不重新编译MySQL源代码,则无法更改MySQL用户名长度。请参阅5.1 documentation中的此说明。这是also the case with MySQL 5.7

  

警告

     

MySQL用户名长度的限制在MySQL服务器中是硬编码的   和客户,并试图通过修改定义来规避它   mysql数据库中的表格不起作用。

答案 1 :(得分:0)

我找到了更好的解决方案: 使用

"INSERT mysql.user (Host,user,Password) VALUES 'localhost','"+user+"',PASSWORD('"+passwd+"');"); 

而不是

SET PASSWORD FOR '"+user+"'@'localhost' = PASSWORD('"+passwd+"');

MySQL不会知道,您修改密码或创建用户,只需运行语句。