原文出处: 温国兵
一 引子
在生产环境中,经常会有这样的场景:获得中文数据。那问题就来了,怎么才能匹配出中文字符呢?
本文提供两种方法。
mysql> SHOW VARIABLES LIKE
"%version%";
+-------------------------+------------------------------+
| Variable_name | Value |
+-------------------------+------------------------------+
| protocol_version | 10 |
| version | 5.1.73 |
| version_comment | MySQL Community Server (GPL) |
| version_compile_machine | i386 |
| version_compile_os | apple-darwin10.3.0 |
+-------------------------+------------------------------+
5 rows
in
set
(0.00 sec)
mysql -S /tmp/mysql_5173.sock -uroot -proot
创建测试表和插入测试数据。
mysql> USE test;
Database
changed
mysql> CREATE
TABLE
user
-> (name
VARCHAR(20)
-> ) DEFAULT
CHARSET = utf8 ENGINE = INNODB;
Query OK, 0 rows
affected (0.10 sec)
mysql> SHOW TABLE
STATUS LIKE
'user'
G;
*************************** 1. row ***************************
Name: user
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 2
Avg_row_length: 8192
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2015-01-16 18:01:36
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in
set
(0.00 sec)
ERROR:
No
query specified
mysql> INSERT
INTO
user
VALUES('robin');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT
INTO
user
VALUES('温国兵');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT
* FROM
user
G;
*************************** 1. row ***************************
name: robin
*************************** 2. row ***************************
name: 温国兵
2 rows
in
set
(0.00 sec)
mysql> SELECT
name,
-> CASE
name
REGEXP "[u0391-uFFE5]"
-> WHEN
1 THEN
"不是中文字符"
-> ELSE
"是中文字符"
-> END
AS
"判断是否是中文字符"
-> FROM
user;
+-----------+-----------------------------+
| name
| 判断是否是中文字符 |
+-----------+-----------------------------+
| robin | 不是中文字符 |
| 温国兵 | 是中文字符 |
+-----------+-----------------------------+
2 rows
in
set
(0.00 sec)
mysql> SELECT
name
FROM
user
WHERE
NOT
(name
REGEXP "[u0391-uFFE5]");
+-----------+
| name
|
+-----------+
| 温国兵 |
+-----------+
1 row in
set
(0.00 sec)
mysql> SELECT
name, length(name), char_length(name) FROM
user;
+-----------+--------------+-------------------+
| name
| length(name) | char_length(name) |
+-----------+--------------+-------------------+
| robin | 5 | 5 |
| 温国兵 | 20 | 9 |
+-----------+--------------+-------------------+
2 rows
in
set
(0.00 sec)
mysql> SELECT
name
FROM
user
WHERE
length(name) char_length(name);
+-----------+
| name
|
+-----------+
| 温国兵 |
+-----------+
1 row in
set
(0.00 sec)