Bug #16209 Stored Function: Character Set of Parameter not converted

Submitted: 5 Jan 2006 1:30 Modified: 28 Jul 2006 16:47
Reporter: Roland Volkmann Email Updates:
Status: Can't repeat Impact on me:
None 
Category:MySQL Server: Stored Routines Severity:S2 (Serious)
Version:5.0.19-BK, 5.0.18-nt OS:Linux (Linux, Windows)
Assigned to: Alexander Nozdrin CPU Architecture:Any

[5 Jan 2006 1:30] Roland Volkmann
Description:
If Database has default-character-set=utf8 and default-collation=utf8_unicode_ci
then you cannot use Stored Functions with String-Parameter from Client, when Parameter contains non-ASCII-Characters (e.g. german umlauts). The Problem doesn't occure on Stored Procedures.

You get error "ERROR 1406 (22001): Data too long for column 'param1' at row 1"

With best regards,

Roland.

How to repeat:
mysql> set names cp850;
Query OK, 0 rows affected (0.00 sec)

mysql> create database test character set utf8 collate utf8_unicode_ci;
Query OK, 1 row affected (0.00 sec)

mysql> connect test;
Connection id:    10
Current database: test

mysql> delimiter //
mysql> CREATE FUNCTION `f_test`(param1 VARCHAR(30))
    ->     RETURNS varchar(30)
    -> begin
    ->   return param1;
    -> end
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE PROCEDURE `p_test`(param1 VARCHAR(30))
    -> BEGIN
    ->   select param1 as result;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> select f_test('Hallo');
+-----------------+
| f_test('Hallo') |
+-----------------+
| Hallo           |
+-----------------+
1 row in set (0.00 sec)

mysql> select f_test('Vögel');
ERROR 1406 (22001): Data too long for column 'param1' at row 1

/******  and now using Procedure instead of Function  *****/

mysql> call p_test('Vögel');
+--------+
| result |
+--------+
| Vögel  |
+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql>

/*****  it doesn't matter which Client Encoding is used  *****/
[6 Jan 2006 13:08] Valeriy Kravchuk
Thank you for a bug report. Verified just as described on 5.0.19-BK on Linux:

mysql> set names cp850;
Query OK, 0 rows affected (0.00 sec)
 
mysql>  select f_test('Vögel');
+------------------+
| f_test('Vögel') |
+------------------+
| V��gel           |
+------------------+
1 row in set (0.00 sec)
 
mysql> call p_test('Vögel');
+--------+
| result |
+--------+
| V?�gel |
+--------+
1 row in set (0.01 sec)
 
Query OK, 0 rows affected, 1 warning (0.05 sec)
 
mysql> show warnings;
+---------+------+---------------------------------------------+
| Level   | Code | Message                                     |
+---------+------+---------------------------------------------+
| Warning | 1265 | Data truncated for column 'param1' at row 1 |
+---------+------+---------------------------------------------+
1 row in set (0.07 sec)
 
mysql> select 'Vögel';
+--------+
| Vögel |
+--------+
| Vögel |
+--------+
1 row in set (0.00 sec)

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.0.19    |
+-----------+
1 row in set (0.07 sec)
 
The results are different, but that warning for procedure and no warnings for function, as well as the results are surely a problem to be solved.
[28 Jul 2006 16:47] Alexander Nozdrin
mysql> set names cp850;
Query OK, 0 rows affected (0.02 sec)

mysql> create database db1 character set utf8 collate utf8_unicode_ci;
Query OK, 1 row affected (0.00 sec)

mysql> use db1
Database changed

mysql> create function f1(p varchar(30)) returns varchar(30) return p;
Query OK, 0 rows affected (0.00 sec)

mysql> create procedure p1(p varchar(30)) select p;
Query OK, 0 rows affected (0.00 sec)

mysql> select f1('Vögel');
+--------------+
| f1('Vögel') |
+--------------+
| Vögel       |
+--------------+
1 row in set (0.00 sec)

mysql> call p1('Vögel');
+--------+
| p      |
+--------+
| Vögel |
+--------+
1 row in set (0.00 sec)
[28 Jul 2006 16:47] Alexander Nozdrin
mysql> select version();
+--------------+
| version()    |
+--------------+
| 5.0.25-debug |
+--------------+
1 row in set (0.00 sec)

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.053 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.