diff --git a/tools/kv_typed/src/as_bytes.rs b/tools/kv_typed/src/as_bytes.rs
index 46e0e3f9f5ac1a451d2c89bace8a5bed76a820b3..4e79a4f8006eb12c81c00d30e95049d08b7a1196 100644
--- a/tools/kv_typed/src/as_bytes.rs
+++ b/tools/kv_typed/src/as_bytes.rs
@@ -61,6 +61,20 @@ where
     }
 }
 
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_btreeset_as_bytes() {
+        BTreeSet::<u64>::new().as_bytes(|bytes| assert_eq!(bytes, &[]));
+    }
+    #[test]
+    fn test_hashset_as_bytes() {
+        HashSet::<u64>::new().as_bytes(|bytes| assert_eq!(bytes, &[]));
+    }
+}
+
 macro_rules! impl_as_bytes_for_le_numbers {
     ($($T:ty),*) => {$(
         impl AsBytes for $T {
diff --git a/tools/kv_typed/src/from_bytes.rs b/tools/kv_typed/src/from_bytes.rs
index 138f9ff8cc732d972cf5f9012a22b56df234e928..5ae7245145392833eff049abd148b0fe5fb8c025 100644
--- a/tools/kv_typed/src/from_bytes.rs
+++ b/tools/kv_typed/src/from_bytes.rs
@@ -97,10 +97,14 @@ where
     type Err = LayoutVerifiedErr;
 
     fn from_bytes(bytes: &[u8]) -> Result<Self, Self::Err> {
-        let layout_verified = zerocopy::LayoutVerified::<_, [T]>::new_slice(bytes)
-            .ok_or(LayoutVerifiedErr(stringify!(BTreeSet<T>)))?;
-        let slice = layout_verified.into_slice();
-        Ok(slice.iter().copied().collect())
+        if bytes.is_empty() {
+            Ok(Self::new())
+        } else {
+            let layout_verified = zerocopy::LayoutVerified::<_, [T]>::new_slice(bytes)
+                .ok_or(LayoutVerifiedErr(stringify!(BTreeSet<T>)))?;
+            let slice = layout_verified.into_slice();
+            Ok(slice.iter().copied().collect())
+        }
     }
 }
 
@@ -111,10 +115,14 @@ where
     type Err = LayoutVerifiedErr;
 
     fn from_bytes(bytes: &[u8]) -> Result<Self, Self::Err> {
-        let layout_verified = zerocopy::LayoutVerified::<_, [T]>::new_slice(bytes)
-            .ok_or(LayoutVerifiedErr(stringify!(HashSet<T>)))?;
-        let slice = layout_verified.into_slice();
-        Ok(slice.iter().copied().collect())
+        if bytes.is_empty() {
+            Ok(Self::new())
+        } else {
+            let layout_verified = zerocopy::LayoutVerified::<_, [T]>::new_slice(bytes)
+                .ok_or(LayoutVerifiedErr(stringify!(HashSet<T>)))?;
+            let slice = layout_verified.into_slice();
+            Ok(slice.iter().copied().collect())
+        }
     }
 }
 
@@ -125,3 +133,25 @@ impl FromBytes for IVec {
         Ok(Self::from(bytes))
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_btreeset_from_bytes() -> Result<(), LayoutVerifiedErr> {
+        assert_eq!(
+            <BTreeSet<u64> as FromBytes>::from_bytes(&[])?,
+            BTreeSet::<u64>::new()
+        );
+        Ok(())
+    }
+    #[test]
+    fn test_hashset_from_bytes() -> Result<(), LayoutVerifiedErr> {
+        assert_eq!(
+            <HashSet<u64> as FromBytes>::from_bytes(&[])?,
+            HashSet::<u64>::new()
+        );
+        Ok(())
+    }
+}
diff --git a/tools/kv_typed/tests/test_db_schema.rs b/tools/kv_typed/tests/test_db_schema.rs
index c312ce200d8316eb3b37f129e456a16c0d5bf296..dead76e10825e0992a0081bac6a1700171274824 100644
--- a/tools/kv_typed/tests/test_db_schema.rs
+++ b/tools/kv_typed/tests/test_db_schema.rs
@@ -116,6 +116,11 @@ fn test_db<B: Backend>(db: &TestV1Db<B>) -> KvResult<()> {
     })?;
 
     // Test get_ref_slice
+    db.col4_write().upsert(U64BE(3), BTreeSet::new())?;
+    db.col4().get_ref_slice(&U64BE(3), |numbers| {
+        assert_eq!(numbers, &[]);
+        Ok(())
+    })?;
     db.col4_write()
         .upsert(U64BE(4), (&[3, 2, 4, 1]).iter().copied().collect())?;
     db.col4().get_ref_slice(&U64BE(4), |numbers| {