diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result
index a6933e0..c09e891 100644
--- a/mysql-test/r/func_str.result
+++ b/mysql-test/r/func_str.result
@@ -4857,6 +4857,9 @@ select charset(chr(14844588)), length(chr(14844588)),char_length(chr(14844588));
 charset(chr(14844588))	length(chr(14844588))	char_length(chr(14844588))
 utf8	3	1
 drop database mysqltest1;
+select lengthb('a'), lengthb( _ucs2 'a'), lengthb(123), lengthb(null);
+lengthb('a')	lengthb( _ucs2 'a')	lengthb(123)	lengthb(null)
+1	2	3	NULL
 #
 # End of 10.1 tests
 #
diff --git a/mysql-test/suite/compat/oracle/r/func_length.result b/mysql-test/suite/compat/oracle/r/func_length.result
new file mode 100644
index 0000000..c002a82
--- /dev/null
+++ b/mysql-test/suite/compat/oracle/r/func_length.result
@@ -0,0 +1,13 @@
+SET sql_mode=ORACLE;
+SELECT length(null),length('a'),length(123);
+length(null)	length('a')	length(123)
+NULL	1	3
+SELECT lengthb(null),lengthb('a'),lengthb(123);
+lengthb(null)	lengthb('a')	lengthb(123)
+NULL	1	3
+SELECT length(_ucs2 'a'), length(char(14844588 using utf8));
+length(_ucs2 'a')	length(char(14844588 using utf8))
+1	1
+SELECT lengthb(_ucs2 'a'),lengthb(char(14844588 using utf8));
+lengthb(_ucs2 'a')	lengthb(char(14844588 using utf8))
+2	3
diff --git a/mysql-test/suite/compat/oracle/t/func_length.test b/mysql-test/suite/compat/oracle/t/func_length.test
new file mode 100644
index 0000000..d4430e7
--- /dev/null
+++ b/mysql-test/suite/compat/oracle/t/func_length.test
@@ -0,0 +1,11 @@
+#
+# Testing LENGTH / LENGTHB
+#
+
+SET sql_mode=ORACLE;
+
+SELECT length(null),length('a'),length(123);
+SELECT lengthb(null),lengthb('a'),lengthb(123);
+
+SELECT length(_ucs2 'a'), length(char(14844588 using utf8));
+SELECT lengthb(_ucs2 'a'),lengthb(char(14844588 using utf8));
\ No newline at end of file
diff --git a/mysql-test/t/func_str.test b/mysql-test/t/func_str.test
index 3bcd32e..95d0678 100644
--- a/mysql-test/t/func_str.test
+++ b/mysql-test/t/func_str.test
@@ -1863,6 +1863,8 @@ select charset(chr(65)), length(chr(65)),char_length(chr(65));
 select charset(chr(14844588)), length(chr(14844588)),char_length(chr(14844588));
 drop database mysqltest1;
 
+select lengthb('a'), lengthb( _ucs2 'a'), lengthb(123), lengthb(null);
+
 --echo #
 --echo # End of 10.1 tests
 --echo #
diff --git a/sql/item_create.cc b/sql/item_create.cc
index 039994c..7aeb997 100644
--- a/sql/item_create.cc
+++ b/sql/item_create.cc
@@ -2166,6 +2166,18 @@ class Create_func_length : public Create_func_arg1
   virtual ~Create_func_length() {}
 };
 
+class Create_func_lengthb : public Create_func_arg1
+{
+public:
+  virtual Item *create_1_arg(THD *thd, Item *arg1);
+
+  static Create_func_lengthb s_singleton;
+
+protected:
+  Create_func_lengthb() {}
+  virtual ~Create_func_lengthb() {}
+};
+
 
 #ifndef DBUG_OFF
 class Create_func_like_range_min : public Create_func_arg2
@@ -5670,6 +5682,17 @@ Create_func_length Create_func_length::s_singleton;
 Item*
 Create_func_length::create_1_arg(THD *thd, Item *arg1)
 {
+  if (thd->variables.sql_mode & MODE_ORACLE)
+    return new (thd->mem_root) Item_func_char_length(thd, arg1);
+  else
+    return new (thd->mem_root) Item_func_length(thd, arg1);
+}
+
+Create_func_lengthb Create_func_lengthb::s_singleton;
+
+Item*
+Create_func_lengthb::create_1_arg(THD *thd, Item *arg1)
+{
   return new (thd->mem_root) Item_func_length(thd, arg1);
 }
 
@@ -6957,6 +6980,7 @@ static Native_func_registry func_array[] =
   { { C_STRING_WITH_LEN("LCASE") }, BUILDER(Create_func_lcase)},
   { { C_STRING_WITH_LEN("LEAST") }, BUILDER(Create_func_least)},
   { { C_STRING_WITH_LEN("LENGTH") }, BUILDER(Create_func_length)},
+  { { C_STRING_WITH_LEN("LENGTHB") }, BUILDER(Create_func_lengthb)},
 #ifndef DBUG_OFF
   { { C_STRING_WITH_LEN("LIKE_RANGE_MIN") }, BUILDER(Create_func_like_range_min)},
   { { C_STRING_WITH_LEN("LIKE_RANGE_MAX") }, BUILDER(Create_func_like_range_max)},
