存档

‘mysql’ 分类的存档

linux下mysql编码配置

2013年5月6日 4 条评论

1 修改/etc/mysql/my.cnf配置文件 增加default-character-set=utf8

配置文件如下

[client]
port		= 3306
socket		= /var/run/mysqld/mysqld.sock
default-character-set=utf8
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket		= /var/run/mysqld/mysqld.sock
nice		= 0
[mysqld]
#
# * Basic Settings
#
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci

2 重启mysql

sudo service mysql restart

分类: linux, mysql 标签: , , , ,

mysql中处理未知大小的varchar

2013年3月18日 1 条评论

如果MySQL中varchar(M)M设置的太大,在磁盘上表占用空间大小只跟varchar中实际存放内容大小有关

但是如果查询要生成临时表,无论临时表是放在内存还是磁盘上,varchar都会扩张成M大小。这样将会消耗更多内存或者磁盘,对性能有严重的影响。

另外能用varchar就不要使用text,text性能很差,而且非常占磁盘空间。

varchar的长度是列共享的,一张表不要超过65535字节,对utf8编码约21485个字符

分类: mysql 标签: ,

“Group by”的”隐形杀手”

2013年3月14日 没有评论
mysql> explain select uid,sum(times) from tbl_name group by uid\G;
*************************** 1. row ***************************
 id: 1
 select_type: SIMPLE
 table: tbl_name
 type: ALL
possible_keys: NULL
 key: NULL
 key_len: NULL
 ref: NULL
 rows: 10000
 Extra: Using temporary; Using filesort
1 row in set (0.00 sec)
mysql> explain select uid,sum(times) from tbl_name group by uid order by null\G;
*************************** 1. row ***************************
 id: 1
 select_type: SIMPLE
 table: tbl_name
 type: ALL
possible_keys: NULL
 key: NULL
 key_len: NULL
 ref: NULL
 rows: 10000
 Extra: Using temporary
1 row in set (0.00 sec)

默认情况下,Group by col会对col字段进行排序,这就是为什么第一语句里面有Using filesort的原因,如果你不需要对col字段进行排序,加上order by null吧,要快很多,因为filesort很慢的。

分类: mysql 标签: , ,

MySQL的varchar定义长度到底是字节还是字符

2013年3月13日 没有评论

环境:CentOS5.x,MySQL5.1.x
UTF8字符集下:

SQL>create table test(id int auto_increment,name varchar(10),primary key(id));
SQL>insert into test values(null,'1234567890');
Query OK, 1 row affected (0.00 sec)
SQL>insert into test values(null,'一二三四五六七八九十');
Query OK, 1 row affected (0.00 sec)
SQL>insert into test values(null,'abcdefghig');
Query OK, 1 row affected (0.01 sec)
SQL>insert into test values(null,12345678901);
ERROR 1406 (22001): Data too long for column 'name' at row 1
SQL>insert into test values(null,'一二三四五六七八九十1');
ERROR 1406 (22001): Data too long for column 'name' at row 1
SQL>insert into test values(null,'一二三四五六七八九十一');
ERROR 1406 (22001): Data too long for column 'name' at row 1
SQL>select id,name,length(name),char_length(name) from test;

阅读全文…

分类: mysql 标签: ,

Ubuntu下安装mysql不能远程连接的问题

2013年2月12日 没有评论

root@ubuntu:~#sudo apt-get install mysql-server
安装完mysql-server
启动mysql
root@ubuntu:~#/etc/init.d/mysql start
本地可以连接进入数据库。
root@ubuntu:~#mysql -uroot -p
设置了远程访问权限:
mysql> grant all PRIVILEGES on *.* to root@’%’ identified by ’123456′;
Query OK, 0 rows affected (0.04 sec)
mysql> use information_schema
mysql> select * from user_privileges;
查询到有下面的结果:’root’@'%’,说明mysql已经授权远程连接。
在windows下访问Ubuntu的数据库,连接不上,但是Ubuntu上安装的apache可以访问。
用iptalbes添加端口3306后也无法访问。
root@ubuntu:~# iptables -A INPUT -p tcp -dport 3306 -j ACCEPT
Ubuntu上查看Mysql网络连接:
root@ubuntu:~# netstat -an |grep 3306
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
本地端口也在监听
root@ubuntu:~# ufw status
Firewall not loaded
本地防火墙未打开

打开 /etc/mysql/my.cnf 文件,找到 bind-address = 127.0.0.1 修改为 bind-address = 0.0.0.0 或者 注释掉
重启mysql : sudo /etc/init.d/mysql restart
就好了,我在windows下就可以连上了。

分类: linux, mysql 标签: , ,

MySQL中的模糊查询和通配符转义

2013年1月14日 没有评论

  MySQL中实现模糊查询有2种方式:一是用LIKE/NOT LIKE,二是用REGEXP/NOT REGEXP(或RLIKE/NOT RLIKE,它们是同义词)。

第一种是标准的SQL模式匹配。它有2种通配符:“_”和“%”。“_”匹配任意单个字符,而“%”匹配任意多个字符