1

我需要一个MySQL的函数剪裁字符串(包括换行和制表符)的开头和末尾的所有空格,所以我创建了以下功能:如何使这个MySQL函数不会搞乱我的字符集?

DROP FUNCTION IF EXISTS WSTrim; 
DELIMITER $$ 
CREATE FUNCTION `WSTrim`(text LONGTEXT CHARSET utf8) RETURNS LONGTEXT CHARSET utf8 
    NO SQL 
    DETERMINISTIC 
BEGIN 
RETURN TRIM(REPLACE(REPLACE(REPLACE(text, '\t', ' '), '\r', ' '), '\n', ' ')); 
END$$ 
DELIMITER ; 

尽管它在参数声明,并在规范说的返回值,这个函数弄乱了我的字符集,我想成为utf8。如果我调用这个函数像这样:

INSERT INTO mytable (name) VALUES (WSTrim(' ČĆŽŠĐ čćžšđ ')); 

我得到一个警告

1 row(s) affected, 1 warning(s): 1366 Incorrect string value: '\xC4\x8C\xC4\x86\xC5\xBD...' for column 'name' at row 1 

如何更改我的功能不会弄乱我的角色?

编辑1:

我使用的连接字符串

Server=myserver;Port=myport;Database=mydb;Uid=myuid;Pwd=mypwd;CharSet=utf8 

而且,完整性,

mysql> show variables where Variable_name like 'character%' or Variable_name like 'collation%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8      | 
| character_set_connection | utf8      | 
| character_set_database | utf8      | 
| character_set_filesystem | binary      | 
| character_set_results | utf8      | 
| character_set_server  | utf8      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
| collation_connection  | utf8_general_ci   | 
| collation_database  | utf8_unicode_ci   | 
| collation_server   | utf8_unicode_ci   | 
+--------------------------+----------------------------+ 

注意,同样的事情发生,即使我连接使用MySQL Workbench,而不仅仅是我的应用程序。

编辑2:

INSERT INTO mytable (name) VALUES (' ČĆŽŠĐ čćžšđ '); 

这正确地插入值。

编辑3:

mysql> SELECT WSTrim(' ČĆŽŠĐ čćžšđ '); 
+-----------------------------------+ 
| WSTrim(' ČĆŽŠĐ čćžšđ ')   | 
+-----------------------------------+ 
| ??ŽŠ? ??žš?      | 
+-----------------------------------+ 
1 row in set, 1 warning (0.01 sec) 

不要紧,我如何发送查询。但是,如果我在

show function status; 

返回的行的一类我注意到的是:

+------+--------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+ 
| Db | Name | Type  | Definer  | Modified   | Created    | Security_type | Comment | character_set_client | collation_connection | Database Collation | 
+------+--------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+ 
| mydb | WSTrim | FUNCTION | [email protected] | 2015-11-23 04:01:06 | 2015-11-23 04:01:06 | DEFINER  |   | latin1    | latin1_swedish_ci | latin1_swedish_ci | 
+------+--------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+ 

出于某种原因,它把功能与latin1。但是,我该如何改变这一点?

编辑4:

mysql> show create database mydb; 
+----------+---------------------------------------------------------------------------------------+ 
| Database | Create Database                  | 
+----------+---------------------------------------------------------------------------------------+ 
| mydb  | CREATE DATABASE `mydb` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */ | 
+----------+---------------------------------------------------------------------------------------+ 
1 row in set (0.01 sec) 
+0

在我的系统上,您的功能正常工作。你的问题可能是由于连接字符串 - 检查设置。 http://makandracards.com/makandra/2529-show-and-change-mysql-default-character-set – PaulF

+0

@PaulF,我编辑了答案。 –

+0

你是否检查过该函数返回的内容:SELECT WSTrim('ČĆŽŠĐčćžšđ'); – PaulF

回答

2

the documentation,从SHOW FUNCTION STATUS表明你没有创建功能的过程中与UTF8连接character_set_clientcollation_connection列。可能你需要检查连接设置,以确保你没有在任何地方定义latin1。

同样,Database Collation列表示数据库本身被定义为latin1。