diff --git a/src/backend/utils/adt/encode.c b/src/backend/utils/adt/encode.c
index 214d835c624..dc86df27efa 100644
--- a/src/backend/utils/adt/encode.c
+++ b/src/backend/utils/adt/encode.c
@@ -885,17 +885,17 @@ base32hex_encode(const char *src, size_t srclen, char *dst)
 static uint64
 base32hex_decode(const char *src, size_t srclen, char *dst)
 {
-	const unsigned char *data = (const unsigned char *) src;
-	uint64		bits_buffer = 0;
+	const char	*srcend = src + srclen,
+		*s = src;
+	uint32		bits_buffer = 0;
 	int			bits_in_buffer = 0;
 	uint64		output_pos = 0;
-	size_t		i;
 	int			pos = 0;		/* position within 8-character group (0-7) */
 	bool		end = false;	/* have we seen padding? */
 
-	for (i = 0; i < srclen; i++)
+	while (s < srcend)
 	{
-		unsigned char c = data[i];
+		char c = *s++;
 		int			val;
 
 		/* Skip whitespace */
@@ -927,7 +927,7 @@ base32hex_decode(const char *src, size_t srclen, char *dst)
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
 					 errmsg("invalid symbol \"%.*s\" found while decoding base32hex sequence",
-							pg_mblen((const char *) &c), (const char *) &c)));
+							pg_mblen_range(s - 1, srcend), s - 1)));
 
 		/* Decode base32hex character (0-9, A-V, case-insensitive) */
 		if (c >= '0' && c <= '9')
@@ -940,7 +940,7 @@ base32hex_decode(const char *src, size_t srclen, char *dst)
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
 					 errmsg("invalid symbol \"%.*s\" found while decoding base32hex sequence",
-							pg_mblen((const char *) &c), (const char *) &c)));
+							pg_mblen_range(s - 1, srcend), s - 1)));
 
 		/* Add 5 bits to buffer */
 		bits_buffer = (bits_buffer << 5) | val;
diff --git a/src/test/regress/expected/strings.out b/src/test/regress/expected/strings.out
index 75a4a4f38a6..0166a57b0d4 100644
--- a/src/test/regress/expected/strings.out
+++ b/src/test/regress/expected/strings.out
@@ -2716,6 +2716,8 @@ SELECT decode('11=', 'base32hex');  -- OK, non-zero padding bits are accepted (c
  \x08
 (1 row)
 
+SELECT decode('あ', 'base32hex'); -- error
+ERROR:  invalid symbol "あ" found while decoding base32hex sequence
 --
 -- base64url encoding/decoding
 --
diff --git a/src/test/regress/sql/strings.sql b/src/test/regress/sql/strings.sql
index 9f86f2cac19..13fcfe21241 100644
--- a/src/test/regress/sql/strings.sql
+++ b/src/test/regress/sql/strings.sql
@@ -861,6 +861,7 @@ SELECT decode('=', 'base32hex');  -- error
 SELECT decode('W', 'base32hex');  -- error
 SELECT decode('24H36H0=24', 'base32hex'); -- error
 SELECT decode('11=', 'base32hex');  -- OK, non-zero padding bits are accepted (consistent with base64)
+SELECT decode('あ', 'base32hex'); -- error
 
 
 --
