11月 112015
 

环境:

mysql数据库表设置字符集为utf8;console终端显示字符集为utf8;如下:

mysql 命令查询的结果显示都是“问号”,解决办法:

 

 Posted by at 下午 2:35
11月 192012
 

从认识mysql开始就开始受困于mysql的字符集问题,希望能花点时间搞清楚,下面是一个什么样的问题呢:

“汉字”在utf8的字符集中是6个字节的,然而,这里却是8个字节,怎么解释呢?而且,“汉字”在utf8字符集中的16进制编码应该是“e6 b1 89  e5 ad 97”

 

参考资料: http://mysql.rjweb.org/doc.php/charcoll

里面有如下一段描述,似乎可以解释上述的问题:

—————————–

“Double encoding” is a term I made up for the following situation. It is a case where “two wrongs make a right”.

⚈  Table defined utf8
⚈  INSERTer declared latin1 (used default instead of doing SET NAMES)
⚈  Data being INSERTed is actually utf8 already.
What happened:
⚈  A 2-byte letter (say, a grave-e) was correctly represented in utf8.
⚈  The INSERT statement handed the 2 bytes to MySQL, but implied the need for conversion
⚈  Each byte was converted to utf8
⚈  The table has 4 bytes.
When SELECTing, the reverse happens 4->2->1, and the user is oblivious of the bug. Looking CHAR_LENGTH will spot it. Strange orderings may happen.

—————————–

看来预期6个字节存储为8个字节还不算严重的,严重的是上面存储翻倍的情况,上面的引用翻译如下:

================

“Double encoding” 是我用来描述下述情况的一个术语,这是一种“错错得对”的情况。

⚈ 表定义为utf8
⚈ INSERT时声明的字符集为latin1(如果没有使用 set names,则默认就是latin1的)
⚈ 要插入的数据确实是utf8编码

发生了什么?
⚈ 一个utf8编码的2字节的字母
⚈ 插入语句写mysql时要对2字节做处理,但是因为字符集声明为latin1的,所以要做编码转换
⚈ 每个字节用2字节的utf8编码表示
⚈ 存储结果为4个字节

在SELECT 的时候,发生一个反向的转换 4->2->1,并且用户不知道这个’bug’,于是就出现了上面的问题

=================

 

 Posted by at 下午 11:21
8月 302011
 

 Posted by at 上午 9:39
3月 052011
 

mysql在数据量大的时候一般采用分库分表的办法来解决读写慢的问题,为什么分库分表之后读写性能就可以提高了呢?
这里尝试做一下分析:

  • 分库有利于利用更多的硬件来提供服务
  • 分表的依据:
        

              

    1. 单表过大时,索引随之就增大;查询的时候,如果索引不在内存中,大的索引需要更多的载入时间;扫描索引的时间也会变大。写入(增、删、改)的时候,大的索引更新速度也慢。
    2.         

    3. 在对表做写操作时,整个表的query cache将失效,大表失效的cache多,而且失效的几率也大,小表的相反。
    4.     

分库分表的缺点:

  1. 无法做联表查询操作,不过这未尝不是好事,对于大数据量,联表查询基本是不建议使用的。
  2.  

相关资料:
http://zhengdl126.javaeye.com/blog/419850

 Posted by at 下午 10:24
10月 292010
 

MySQL Show命令的使用

show tables或show tables from database_name;
解释:显示当前数据库中所有表的名称

show databases;
解释:显示mysql中所有数据库的名称

show processlist;
解释:显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看
他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。

show table status;
解释:显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间

show columns from table_name from database_name; 或show columns from database_name.table_name;
解释:显示表中列名称

show grants for user_name@localhost;
解释:显示一个用户的权限,显示结果类似于grant 命令

show index from table_name;
解释:显示表的索引

show status;
解释:显示一些系统特定资源的信息,例如,正在运行的线程数量

show variables;
解释:显示系统变量的名称和值

show privileges;
解释:显示服务器所支持的不同权限

show create database database_name;
解释:显示create database 语句是否能够创建指定的数据库

show create table table_name;
解释:显示create database 语句是否能够创建指定的数据库

show engies;
解释:显示安装以后可用的存储引擎和默认引擎。

show innodb status;
解释:显示innoDB存储引擎的状态

show logs;
解释:显示BDB存储引擎的日志

show warnings;
解释:显示最后一个执行的语句所产生的错误、警告和通知

show errors;
解释:只显示最后一个执行语句所产生的错误

 Posted by at 上午 3:02
10月 282010
 

现象:
新安装了一台机器,Apache + PHP; 访问时候出现错误:
*** glibc detected *** /data1/apache2/bin/httpd: double free or corruption (!prev): 0x0971ef80 ***

调试步骤:
1。 让apache的进程数减少为2个, strace -p pid; 观察异常所在,没有发现明显的出错地点

2。 在请求的PHP文件中添加断点,发现在mysql_connect 时出现的上述错误

3。 ldd mysql.so 和 ldd mysql 相比较,发现使用的libmysqlclient.so文件不同,系统里面有两套;相比是使用的include头文件和lib文件不是一个版本的

4。 删除安装的杂乱的mysql文件

5。 安装: mysql-5.1.47-linux-i686-glibc23.tar.gz    这个解压就行,不需要编译

6。 指定上面解压的mysql目录,重新编译PHP的mysql模块,问题解决

关于启动mysqld的一些问题:
1。 安装mysqld系统表文件,使用脚本scripts/mysql_install_db ; 需要在script平级的目录执行; 其原理是,使用越过权限检查的方式启动mysqld,默认的my.cnf是/etc/my.cnf ; 将创建系统表的sql语句放到mysqld中执行,于是生成的系统表就放在了(my.cnf中指定的)mysql数据库目录中了

2。 安装后的系统表可能用户权限不对,导致无法启动数据库,这就需要修改系统表和mysql数据库的权限了

调试过程中分别使用了:
strace、ldd、sh -x 等办法

 Posted by at 下午 10:38
9月 062010
 

server-id做什么用的,你知道吗?

1、 mysql的同步的数据中是包含server-id的,用于标识该语句最初是从哪个server写入的,所以server-id一定要有的

2、 每一个同步中的slave在master上都对应一个master线程,该线程就是通过slave的server-id来标识的;每个slave在master端最多有一个master线程,如果两个slave的server-id 相同,则后一个连接成功时,前一个将被踢掉。 这里至少有这么一种考虑:
   slave主动连接master之后,如果slave上面执行了slave stop;则连接断开,但是master上对应的线程并没有退出;当slave start之后,master不能再创建一个线程而保留原来的线程,那样同步就可能有问题;

3、 在mysql做主主同步时,多个主需要构成一个环状,但是同步的时候有要保证一条数据不会陷入死循环,这里就是靠server-id来实现的

 Posted by at 上午 8:04
8月 192010
 


select * from tb1 where field1 like  ‘mmmm’ and field2=’nnnnn’ ;

如果field1和field2都做了索引,则这里使用field2的索引,因为“等号”操作比“like”操作效率更高

 Posted by at 上午 4:03
7月 132010
 

从MySQL 5.0 开始,
支持了一个全新的SQL句法:

PREPARE stmt_name FROM preparable_stmt;

EXECUTE stmt_name [USING @var_name [, @var_name] …];

{DEALLOCATE | DROP} PREPARE stmt_name;

 

通过它,我们就可以实现类似 MS SQL 的 sp_executesql 执行动态SQL语句!
同时也可以防止注入式攻击!

为了有一个感性的认识,
下面先给几个小例子:

mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?";
mysql> EXECUTE STMT USING @a;

 Posted by at 下午 10:21