From e8412e9ea51bfa6c7c4a6eb758f6f4913494ed4e Mon Sep 17 00:00:00 2001 From: "bar@bar.mysql.r18.ru" <> Date: Thu, 27 Feb 2003 12:10:41 +0400 Subject: [PATCH] field.cc: Now all text fields convert data into proper charset before storing --- sql/field.cc | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/sql/field.cc b/sql/field.cc index 58111bfbe5d..b96b987ec90 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -3878,6 +3878,15 @@ void Field_datetime::sql_type(String &res) const int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) { int error= 0; + char buff[80]; + String tmpstr(buff,sizeof(buff), &my_charset_bin); + /* Convert character set if nesessary */ + if ((cs != field_charset) && (cs!=&my_charset_bin) && (!binary())) + { + tmpstr.copy(from, length, cs, field_charset); + from= tmpstr.ptr(); + length= tmpstr.length(); + } if (length <= field_length) { memcpy(ptr,from,length); @@ -4051,6 +4060,15 @@ uint Field_string::max_packed_col_length(uint max_length) int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) { int error= 0; + char buff[80]; + String tmpstr(buff,sizeof(buff), &my_charset_bin); + /* Convert character set if nesessary */ + if ((cs != field_charset) && (cs!=&my_charset_bin) && (!binary())) + { + tmpstr.copy(from, length, cs, field_charset); + from= tmpstr.ptr(); + length= tmpstr.length(); + } if (length > field_length) { length=field_length; @@ -4359,6 +4377,15 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs) } else { + char buff[80]; + String tmpstr(buff,sizeof(buff), &my_charset_bin); + /* Convert character set if nesessary */ + if ((cs != field_charset) && (cs!=&my_charset_bin) && (!binary())) + { + tmpstr.copy(from, length, cs, field_charset); + from= tmpstr.ptr(); + length= tmpstr.length(); + } Field_blob::store_length(length); if (table->copy_blobs || length <= MAX_FIELD_WIDTH) { // Must make a copy @@ -4827,6 +4854,15 @@ uint find_enum(TYPELIB *lib,const char *x, uint length) int Field_enum::store(const char *from,uint length,CHARSET_INFO *cs) { int err= 0; + char buff[80]; + String tmpstr(buff,sizeof(buff), &my_charset_bin); + /* Convert character set if nesessary */ + if ((cs != field_charset) && (cs!=&my_charset_bin) && (!binary())) + { + tmpstr.copy(from, length, cs, field_charset); + from= tmpstr.ptr(); + length= tmpstr.length(); + } uint tmp=find_enum(typelib,from,length); if (!tmp) { @@ -5033,7 +5069,15 @@ int Field_set::store(const char *from,uint length,CHARSET_INFO *cs) int err= 0; char *not_used; uint not_used2; - + char buff[80]; + String tmpstr(buff,sizeof(buff), &my_charset_bin); + /* Convert character set if nesessary */ + if ((cs != field_charset) && (cs!=&my_charset_bin) && (!binary())) + { + tmpstr.copy(from, length, cs, field_charset); + from= tmpstr.ptr(); + length= tmpstr.length(); + } ulonglong tmp= find_set(typelib, from, length, ¬_used, ¬_used2); if (!tmp && length && length < 22) {