JDBC在连接到localhost时忽略用户名

时间:2016-12-01 14:38:17

标签: java mysql jdbc

如果我通过localhost127.0.0.1访问我的本地MySQL数据库,则会收到错误消息java.sql.SQLSyntaxErrorException: Access denied for user ''@'localhost' to database 'mydb'

我也尝试过使用参数&user=crm。 如果我使用extrernal ip我可以登录没有问题。 我正在使用mysql-connector-java:6.0.5

我错过了什么吗?

private static Connection connect;

public static Connection getDatabaseConnection() {
    if (connect == null) {
        try {
            connect = DriverManager
                    .getConnection("jdbc:mysql://localhost:3306/mydb?serverTimezone=Europe/Berlin","crm",null);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    return connect;
}

编辑:添加端口号,即使它没有解决问题

EDIT2:

mysql>     select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+   
| crm  | %         |
| root | 127.0.0.1 |
| root | ::1       |
|      | localhost |
| pma  | localhost |
| root | localhost |
+------+-----------+
6 rows in set (0.00 sec)

EDIT3: 如果密码不是null而不是空String,则使用用户名。 mayby它的mysql-connector-java:6.0.5 bug

EDIT4: 问题不是mysql-connector-java:6.0.5,因为如果我使用标准的MySQL cli客户端,我会得到相同的bahavour。我用mysql -u crm登录数据库,然后得到一个shell。如果我现在尝试更改为mydb数据库,则会出现以下错误

mysql> use mydb
ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mydb'

即使im manualy设置权限我仍然会得到相同的错误

 GRANT ALL PRIVILEGES ON `mydb`.* TO 'crm'@'%';

由于某种原因MySQL不喜欢我的不存在的密码

2 个答案:

答案 0 :(得分:0)

用户" crm"主机列可能未设置为接受来自localhost的请求。

请运行以下MySQL命令:

  

从mysql.user选择用户,主机;

检查是否代替主持人"%"是他们与否。 如果没有按照以下命令运行:

  

更新mysql.user set host ="%" user =" crm&#34 ;;

     

从mysql.user选择用户,主机;

现在它应该显示"%"。

希望它有所帮助。

答案 1 :(得分:-1)

export function SimpleImage(props) {
  const {
    src,
    width = 200,
    height = 200,
    rounded,
    circle,
    status,
    onLoad,
    onFail,
  } = props;

  const mainWrapperStyle = style({
    backgroundColor: 'white',
    backgroundSize: 'contain',
    backgroundRepeat: 'none',
    boxSizing: 'border-box',
    position: 'relative',
    width,
    height,
  });

  const roundedStyle = style({
    borderRadius: '10%',
    overflow: 'hidden',
  });

  const circularStyle = style({
    borderRadius: '50%',
    overflow: 'hidden',
  });

  const defaultImageStyle = style({
    opacity: 0,
    transisition: 'opacity 150ms ease',
  });

  const loadedImageStyle = style({
    opacity: 1,
  });

  let imageStyle = defaultImageStyle;

  let wrapperStyle = mainWrapperStyle;
  if (rounded) {
    wrapperStyle = merge(mainWrapperStyle, roundedStyle);
  } else if (circle) {
    wrapperStyle = merge(mainWrapperStyle, circularStyle);
  }

  if (status === LOADED) {
    imageStyle = merge(defaultImageStyle, loadedImageStyle);
  }

  const image = (<img
      {...imageStyle}
      src={src}
      width={width}
      height={height}
      role="presentation"
      onLoad={this.onLoad}
      onError={this.onFail}
      />);

  let statusIndicator = null;
  if (this.state.status === LOADING) {
    statusIndicator = (<LoadingIndicator />);
  } else if (this.state.status === FAILED) {
    statusIndicator = (<ErrorIndicator />);
  }

  return (<div {...wrapperStyle}>
    {statusIndicator}
    {image}
  </div>);
}

const Image = compose(
  withState(
    'status',
    'setStatus',
    ({ src })=> src? LOADING: PENDING
  ),
  withProps(
    ({ setStatus }) => ({
    onLoad() {
      setStatus(LOADED);
    },
    onFail() {
      setStatus(FAILED);
    },
    reset() {
      setStatus(PENDING)
    },
    resetToLoading() {
      setStatus(LOADING)
    },
  })),
  lifecycle({
    componentWillReceiveProps(nextProps) {
      if(nextProps.src == null){
        this.props.reset();
      } else if(nextProps.src !== this.props.src) {
        this.props.resetToLoading();
      }
    }
  })
)(SimpleImage);

请尝试以上连接。让我知道它是否有效。