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 

Как изменить свою функцию, чтобы не испортить свои персонаж?

Edit 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 (' ČĆŽŠĐ čćžšđ '); 

Это правильно вставляет значение.

Edit 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, в character_set_client и collation_connection столбцов из SHOW FUNCTION STATUS показывают, что вы не были связаны с utf8 при создании функции. Вероятно, вам нужно будет проверить настройки подключения, чтобы убедиться, что у вас нет latin1.

Кроме того, столбец Database Collation указывает, что сама база данных называется latin1.