解决MySQL不允许从远程访问的方法

1。 改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”localhost”改称”%”

mysql -u root -p  
mysql>use mysql;  
mysql>update user set host = '%' where user = 'root';  
mysql>select host, user from user;

2. 授权法。例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。

GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WI  
TH GRANT OPTION;  
FLUSH   PRIVILEGES;

如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作为密码

GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY   
'mypassword' WITH GRANT OPTION;   
FLUSH   PRIVILEGES;

如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器的dk数据库,并使用mypassword作为密码

GRANT ALL PRIVILEGES ON dk.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY   
'mypassword' WITH GRANT OPTION;   
FLUSH   PRIVILEGES;

注意授权后必须FLUSH   PRIVILEGES;否则无法立即生效。

另外一种方法.

在安装mysql的机器上运行:
1、d:\mysql\bin\>mysql   -h   localhost   -u   root
//这样应该可以进入MySQL服务器
2、mysql>GRANT   ALL   PRIVILEGES   ON   *.*   TO   ‘root’@’%’   WITH   GRANT   OPTION
//赋予任何主机访问数据的权限
3、mysql>FLUSH   PRIVILEGES
//修改生效
4、mysql>EXIT
//退出MySQL服务器
这样就可以在其它任何的主机上以root身份登录啦!

Linux下MySQL的大小写区分问题

1、linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写;

2、用root帐号登录后,在/etc/my.cnf 中的[mysqld]后添加添加lower_case_table_names=1,重启MYSQL服务,这时已设置成功:不区分表名的大小写;
lower_case_table_names参数详解:
lower_case_table_names = 0
其中 0:区分大小写,1:不区分大小写
MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
1、数据库名与表名是严格区分大小写的;
2、表的别名是严格区分大小写的;
3、列名与列的别名在所有的情况下均是忽略大小写的;
4、变量名也是严格区分大小写的;
MySQL在Windows下都不区分大小写。

3、如果想在查询时区分字段值的大小写,则:字段值需要设置BINARY属性,设置的方法有多种:
A、创建时设置:
CREATE TABLE T(
A VARCHAR(10) BINARY
);
B、使用alter修改:
ALTER TABLE `tablename` MODIFY COLUMN `cloname` VARCHAR(45) BINARY;
C、mysql table editor中直接勾选BINARY项。

使用正则表达式按位数拆分数字

看下面一段代码:

s='12345678'  
s.gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")

返回的结果是12,345,678

正则表达式中,?=为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,?!为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串,这个正则表达式的意思为:匹配以一个数字开头,接着跟上N组3个数字,但不以一个数字结尾。

?=和?!为预查,不消耗字符串,发现匹配后立即开始下一次搜索,而不是从包含预查的字符之后开始。

gsub!和scan一样,从字符串的0位开始扫描匹配正则表达式,所以当扫描到1位时,出现第一个匹配的字符串为2345678,返回[2,678],接着向后扫描到4位时,出现第二个匹配的字符串为5678,返回[5,678]。

Spring注入全局的HttpServletRequest

Spring的Controller默认是单例的,也就是说,如果Controller中有个field使用@Autowired自动注入,那么注入后这个field的值在该Controller中是全局的,不会再改变的(手动修改除外)。
在Controller中,很多方法都会用到HttpServletRequest,一般会在方法的参数中写上HttpServletRequest,Spring会自动将这个参数传进来。如果大量的方法都需要这个参数,可以将这个参数定义在Controller的一个field中。

@Controller
@RequestMapping("/")
public class HomeAction {

    @RequestMapping(value = {"", "/"})
    public String index(HttpServletRequest request, HttpServletResponse       response) {
//do something
    }

    @RequestMapping(value = {"list"})
    public String list(HttpServletRequest request, HttpServletResponse response) {
//do something
    }
}

可以使用这种方式来改写,这样所有的方法中都可以直接使用HttpServletRequest:

@Controller
@RequestMapping("/")
public class HomeAction {
    @Autowired
    private HttpServletRequest request;

    @RequestMapping(value = {"", "/"})
    public String index(HttpServletResponse  response) {
//do something
    }

    @RequestMapping(value = "list")
    public String list(HttpServletResponse response) {
//do something
    }
}

这里第一感觉会有点奇怪,因为在HomeAction实例化的时候,HttpServletRequest就已经设置进去了,而且在该Controller实例的整个生命周期内,HttpServletRequest的值都不会变化,那么在多线程的时候,怎么能保证每次使用的HttpServletRequest都能正确对应到当前的http请求呢?
Spring注入的这个HttpServletRequest,其实只是一个代理类,每次调用该request的方法时,会先使用RequestContextHolder.currentRequestAttributes().getRequest() 来获取到当前的实际http请求,然后再执行该实际request的对应方法。

这是一个非常好的使用代理模式的例子,代理类可以全局唯一,但是具体实现类可以有很多不同的实例。

除了在Controller中可以注入HttpServletRequest,在拦截器中也可以进行注入,这样拦截器中可以使用的信息就非常多了。

public class SomeInterceptor implements MethodInterceptor {

    @Autowired
    private HttpServletRequest request;

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
      //do something
    }
}

除了HttpServletRequest外,还有很多其他内容可以通过Spring自动注入,例如:

  • ServletRequest
  • ServletResponse
  • HttpSession
  • Principal
  • Locale
  • InputStream
  • Reader
  • OutputStream
  • Writer

以上Spring能自动注入的列表摘自AnnotationMethodHandlerAdapter.resolveStandardArgument