MySQL utf8mb4 字符集

遇到的问题

有一个项目需要存储 emoji 表情。另外极少数中文在存储的时候也遇到 utf8 编码格式的数据库在储存时报错。

Rails creating schema_migrations - Mysql2::Error: Specified key was too long

问题原因

  1. mysql 里的 utf8 一个字符最多 3 字节,只支持 BMP 这部分的 unicode 编码区
  2. BMP 是从哪到哪,基本就是0000~FFFF这一区
  3. utf8mb4 则扩展到一个字符最多能有 4 字节,所以能支持更多的字符集

结论

  1. utf8mb4 兼容 utf8 且比 utf8 能表示更多的字符
  2. 至于什么时候用,看unicode编码区
  3. 从 1 – 126 就属于传统 utf8 区,当然 utf8mb4 也兼容这个区,126 行以下就是 utf8mb4 扩充区,什么时候你需要存储那些字符,你才用 utf8mb4 否则只是浪费空间
  4. 涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集
  5. utf8mb4 是 utf8 的超集

升级步骤

  1. 备份数据库
  2. 升级 MySQL Server 到 v5.5.3+ (低版本不支持这个字符集、复制报错)
  3. 修改 database、table 和 column 字符集
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# Example
ALTER TABLE `table_name` MODIFY COLUMN `column_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
  • 修改 my.cnf
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
  • 重启 MySQL Server、检查字符集
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client    | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database  | utf8mb4            |
| character_set_filesystem | binary            |
| character_set_results    | utf8mb4            |
| character_set_server    | utf8mb4            |
| character_set_system    | utf8              |
| collation_connection    | utf8mb4_unicode_ci |
| collation_database      | utf8mb4_unicode_ci |
| collation_server        | utf8mb4_unicode_ci |
+--------------------------+--------------------+
 rows in set (0.00 sec)

如何把 emoji 编码转换为 emoji 表情

阿里云 RDS 对 utf8mb4 的支持

RDS 是支持 utf8mb4 编码的。如果在数据库管理界面修改之后,对新创建的表默认就是支持 utf8mb4 ,对已经存在表,在字段上做字符集的修改操作才可以。

禁用 Firefox 中的 Hello, Pocket, Reader View 和 WebRTC

在about:config中找到并修改为以下值:

  • loop.enabled = false //disable Firefox Hello
  • browser.pocket.enabled = false //disable Pocket plugin
  • reader.parse-on-load.enabled = false //disable Reader View
  • media.peerconnection.enabled = false //disable WebRTC

P.S. 其实有个插件也可以禁用这些功能(Hello, Pocket, Reader View),下载地址为: https://addons.mozilla.org/en-us/firefox/addon/disable-hello-pocket-reader/

WebRTC一般用不到,建议禁用。

以上插件禁用后,Firefox的内存占用会显著减小。

转载自:http://yuv.me/disable-hello-pocket-reader-view-and-webrtc-in-firefox/

MySQL 数据库自动备份

首先创建一个 sh 脚本文件并保存,比如保存到 /usr/local/sbin/autoback_mysql.sh

#!/bin/bash

# 日期文件夹格式,比如:YYYYMMDD

DATE=$(date +"%Y%m%d")

# 备份文件保存目录 (记得创建这个目录)

BACKUP_DIR="/backup/mysql"

# MySQL 登陆信息

MYSQL_USER="root"
MYSQL_PASSWORD="YOURSECUREPASSWORD"

# MySQL 执行文件路径 (不需要更改)

MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump

# MySQL 忽略备份的数据库

SKIPDATABASES="Database|information_schema|performance_schema|mysql"

# 保存最近多少天内的备份 (超过天数的备份会被自动删除)

RETENTION=14

# ---- 下面的代码请不要修改 ------------------------------------------
#
# 创建按日期保存备份的文件夹

mkdir -p $BACKUP_DIR/$DATE

# 获取所有数据库列表

databases=`$MYSQL -u$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "($SKIPDATABASES)"`

# 存储数据库到文件,并使用 gzip 压缩

for db in $databases; do
echo $db
$MYSQLDUMP --force --opt --user=$MYSQL_USER -p$MYSQL_PASSWORD --skip-lock-tables --events --databases $db | gzip > "$BACKUP_DIR/$DATE/$db.sql.gz"
done

# 删除超过天数的备份文件夹

find $BACKUP_DIR/* -mtime +$RETENTION -exec rm {} \;

给 sh 脚本文件可运行权限

chmod 755 /usr/local/sbin/autoback_mysql.sh

创建一个计划任务,每天凌晨 1 点运行这个脚本

# 编辑 crontab 文件
nano /etc/crontab

# 增加一行
0 1 * * * root /usr/local/sbin/autoback_mysql.sh

重启计划任务服务,让更改生效

service cron restart

 

Build lastest nginx and ngx_pagespeed in Ubuntu 14.04

以前写过一篇在 Ubuntu 12.04 LTS 上面部署 ngx_pagespeed 的文章,现在 Ubuntu LTS 版本已经更新为 14.04 了,ngx_pagespeed 部署的方法也有稍许改变,所以就更新一片文章,记录一下!

PageSpeed 是谷歌开发的一个服务器过滤模块,可以在服务器上自动将网页性能最佳实践应用到页面和相关资源,从而加速网站,减少页面加载时间。ngx_pagespeed 是 Nginx 的 PageSpeed 扩展模块,功能包括:

  • 图片优化: stripping meta-data, dynamic resizing, recompression
  • CSS & JavaScript 压缩、合并等
  • 小资源的内联
  • 推迟图片和 JS 的加载
  • HTML 重写
  • 延长缓存扩展

今天我们就把 Nginx 和 ngx_pagespeed 部署到 Ubuntu 服务器上。

继续阅读Build lastest nginx and ngx_pagespeed in Ubuntu 14.04