标签归档:mysql

过滤utf8mb4字符转为mysql支持的utf8

最近做开发 发现,有些字符不能存进mysql,后来百度后,得出的结论是,mysql的utf8编码并不是真正完整的utf8,在mysql新版本里选择utf8mb4这才是完整的utf8编码。
手机上有些图标比如: Emoji表情图标 在mysql里面需要选择utf8mb4才能存储和显示,网上大部分用mysql存Emoji表情相关的解决办法是 把mysql的字符集改为 utf8mb4,但是 最近有个需求就是截取掉对于mysql的utf8mb4的字符集。想了几天,突然想在wordpress看代码,结果 果然找到,分享之。此方案为过滤掉 utf8mb4 的字符

我这里的mysql本来就不支持utf8mb4的,所以就这样基本上看不到效果….

    $str = '□测试,测试!123□';
    $charset = 'utf8';
    $regex = '/
        (
            (?: [\x00-\x7F]                  # single-byte sequences   0xxxxxxx
            |   [\xC2-\xDF][\x80-\xBF]       # double-byte sequences   110xxxxx 10xxxxxx
            |   \xE0[\xA0-\xBF][\x80-\xBF]   # triple-byte sequences   1110xxxx 10xxxxxx * 2
            |   [\xE1-\xEC][\x80-\xBF]{2}
            |   \xED[\x80-\x9F][\x80-\xBF]
            |   [\xEE-\xEF][\x80-\xBF]{2}';

    if ( 'utf8mb4' === $charset ) {
        $regex .= '
            |    \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences   11110xxx 10xxxxxx * 3
            |    [\xF1-\xF3][\x80-\xBF]{3}
            |    \xF4[\x80-\x8F][\x80-\xBF]{2}
        ';
    }

    $regex .= '){1,40}                          # ...one or more times
        )
        | .                                  # anything else
        /x';
    $str1 = preg_replace( $regex, '$1', $str );
    var_dump($str1);

    //另一种解决方法
    $str1 = preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $str);
    var_dump($str1);

MySQL数据库里面InnoDB与Myisam的对比区别

最近一段时间有点小忙,做了关于支付的东西。
因为支付方面的业务很严谨,所以看到代码里面用了 MYSQL的事务功能,抽空自己也弄了一下,才发现MyISAM根本就不支持 事务,InnoDB支持事务。
然后百度了一下 MyISAM和InnoDB 区别。找到以下表格,贴出来以免忘了 继续阅读

MySQL的保留关键字,使用时尽量避免

mysql保留字

今天用phpmyadmin时,注意到一个提示:
列名 ‘update’ 是一个MySQL 保留关键字。

突然意识到还是应该尽量避免这些保留关键字,也百度了一下。找到了这些关键字,列出来下
使用mysql时一定要注意,不要使用它的保留字作为表名或者列名,否则会出现莫名其妙的错误。

从网上找了一个mysql的保留字列表,仅供参考。
ADD ALL ALTER
ANALYZE AND AS
ASC ASENSITIVE BEFORE
BETWEEN BIGINT BINARY
BLOB BOTH BY
CALL CASCADE CASE
CHANGE CHAR CHARACTER
CHECK COLLATE COLUMN
CONDITION CONNECTION CONSTRAINT
CONTINUE CONVERT CREATE
CROSS CURRENT_DATE CURRENT_TIME
CURRENT_TIMESTAMP CURRENT_USER CURSOR
DATABASE DATABASES DAY_HOUR
DAY_MICROSECOND DAY_MINUTE DAY_SECOND
DEC DECIMAL DECLARE
DEFAULT DELAYED DELETE
DESC DESCRIBE DETERMINISTIC
DISTINCT DISTINCTROW DIV
DOUBLE DROP DUAL
EACH ELSE ELSEIF
ENCLOSED ESCAPED EXISTS
EXIT EXPLAIN FALSE
FETCH FLOAT FLOAT4
FLOAT8 FOR FORCE
FOREIGN FROM FULLTEXT
GOTO GRANT GROUP
HAVING HIGH_PRIORITY HOUR_MICROSECOND
HOUR_MINUTE HOUR_SECOND IF
IGNORE IN INDEX
INFILE INNER INOUT
INSENSITIVE INSERT INT
INT1 INT2 INT3
INT4 INT8 INTEGER
INTERVAL INTO IS
ITERATE JOIN KEY
KEYS KILL LABEL
LEADING LEAVE LEFT
LIKE LIMIT LINEAR
LINES LOAD LOCALTIME
LOCALTIMESTAMP LOCK LONG
LONGBLOB LONGTEXT LOOP
LOW_PRIORITY MATCH MEDIUMBLOB
MEDIUMINT MEDIUMTEXT MIDDLEINT
MINUTE_MICROSECOND MINUTE_SECOND MOD
MODIFIES NATURAL NOT
NO_WRITE_TO_BINLOG NULL NUMERIC
ON OPTIMIZE OPTION
OPTIONALLY OR ORDER
OUT OUTER OUTFILE
PRECISION PRIMARY PROCEDURE
PURGE RAID0 RANGE
READ READS REAL
REFERENCES REGEXP RELEASE
RENAME REPEAT REPLACE
REQUIRE RESTRICT RETURN
REVOKE RIGHT RLIKE
SCHEMA SCHEMAS SECOND_MICROSECOND
SELECT SENSITIVE SEPARATOR
SET SHOW SMALLINT
SPATIAL SPECIFIC SQL
SQLEXCEPTION SQLSTATE SQLWARNING
SQL_BIG_RESULT SQL_CALC_FOUND_ROWS SQL_SMALL_RESULT
SSL STARTING STRAIGHT_JOIN
TABLE TERMINATED THEN
TINYBLOB TINYINT TINYTEXT
TO TRAILING TRIGGER
TRUE UNDO UNION
UNIQUE UNLOCK UNSIGNED
UPDATE USAGE USE
USING UTC_DATE UTC_TIME
UTC_TIMESTAMP VALUES VARBINARY
VARCHAR VARCHARACTER VARYING
WHEN WHERE WHILE
WITH WRITE X509
XOR YEAR_MONTH ZEROFILL

注:MySQL允许部分关键字用做未引起来的识别符,因为许多人以前曾使用过它们。如:ACTION、BIT、DATE、ENUM、NO、TEXT、TIME、TIMESTAMP

Linux用crontabs做MySQL本地备份

和两天数据库服务器出了点问题,突然打不开,还担心是硬盘坏了。结果问机房的半天才给答复,说是机房停电。。。坑爹

不过这次停电也敲了下警钟,要有备份的意识啊。。。

线上mysql服务器是Linux的,就记录下 linux下的mysql备份,Let’s go!!!

线上服务器是最小化安装的 CentOS6,没有自带crontab,所以要自己装个,并设置好自启动。 继续阅读

利用odbc把access转mysql数据库

公司这几天公司要把一个asp的网站转成php的网站。asp网站数据库用的是 access,如果要转到 php的话,先要把数据库转成mysql的先。网上搜了半天都是利用各种软件,我也下来用了,不知道为什么用软件把access转sql文件有些表会出错。而且导出来只有数据,没有表结构。

不多说了,直接上方法。

需要的软件:

  1. myodbc 5.X 以上
  2. access软件
  3. mysql数据库

这里只说下myodbc。。。

下载地址是http://www.mysql.com/downloads/connector/odbc/

我下的是ODBC 5.1.11 地址是 http://dev.mysql.com/get/Downloads/Connector-ODBC/5.1/mysql-connector-odbc-5.1.11-win32.msi/from/http://mysql.easynet.be/

下载好装好后用myodbc连接mysql数据库,配制方法如下图

打开 控制面板 => 管理工具里面 => 设置数据源 => 用户DSN => 添加 => 选择 MySQL ODBC

然后就是填mysql数据库的一些信息,本地的话一般是 如下图

到这里,mysql和odbc都已配置完毕。现在就可以在access里面导出了。。。

在access里面选择表后单击右键 就会有导出,导出的时候选择odbc,然后就会选择数据源,选择机器数据源,然后找到刚才配置odbc添加的那个。这样就OK了。。。

这样就把表从access导入到mysql了。。。然后现在表里没有主键,自己根据表的数据,定个主键,这样就可以正常用了。。。

 

debian系统下的mysql数据库服务器重设root用户的密码

因为公司的Discuz论坛准备搬到新的服务器上面。所以在本地尝试搬家,发现Mysql服务器拒绝远程服务,然后就在 phpmyadmin 弄数据库权限,尝试添加一个用户可以发送远程请求。

结果弄完后 准备把新加的用户删了,不小心手划把自己也删了。。。怎么办root密码又不知道,只有想办法找回root密码然后添加之前的用户,然后分配管理权限。

公司的服务器是用的LAMP架构,Linux是用的debian的,下面就说一下在debian Linux的操作

下面具体说下 MySQL重置root密码:

打开机器登录Linux这些废话就不说了。。。直接从输入的命令说起

第一步:停止mysql服务

/etc/init.d/mysql stop

第二步:设置忽略密码启动mysql服务器

在安装目录找到my.ini配置文件,打开配置文件,找到[mysqld]一行,在下面添加skip-grant-tables后保存该文件,重新启mysql动服务。。。安装目录一般情况下在 /etc/mysql/ 目录下。

/etc/init.d/mysql start

第三步:用root用户登录Mysql并重设密码

#mysql -u root

  • mysql> use mysql;
  • mysql> update user set password=PASSWORD(“此处为新设密码“) where User=’root’;
  • mysql> flush privileges;
  • mysql> quit

第四步:把 /etc/mysql/my.ini 下面添加的 skip-grant-tables 注释掉。然后重启Mysql

/etc/init.d/mysql restart

这样就OK了。。。然后用root添加新帐户分配权限