мне нужна функция 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)
В моей системе ваша функция работает правильно. Ваша проблема может быть связана с строкой соединения - проверьте ее настройку. http://makandracards.com/makandra/2529-show-and-change-mysql-default-character-set – PaulF
@PaulF, я отредактировал ответ. –
Вы проверили, что возвращается функцией: SELECT WSTrim ('ČĆŽŠĐ čćžšđ'); – PaulF