You can dig the answer to questions of this type out of the x86 reference manual but it's usually much faster and easier to write a tiny test assembly program, assemble it, and then disassemble it.
$ cat > test.s <<EOF
.text
.globl x
x:
xorl %edx, %edx
xorq %rdx, %rdx
movl $0, %edx
movq $0, %rdx
EOF
$ as test.s -o test.o
$ objdump -d test.o
test.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <x>:
0: 31 d2 xor %edx,%edx
2: 48 31 d2 xor %rdx,%rdx
5: ba 00 00 00 00 mov $0x0,%edx
a: 48 c7 c2 00 00 00 00 mov $0x0,%rdx
All four of these instructions clear RDX, because x86-64 automatically zero-extends the result of any 32-bit operation to the full width of the register. You can see from the disassembly dump that they are encoded with two, three, five, and seven bytes respectively, so your original surmise was correct.
A reason to use the longer instructions is that XOR sets the condition codes (so after xor %edx, %edx
you will have ZF=1, OF=SF=PF=CF=0, and AF undefined) but MOV does not. This could matter if you were trying to fine-tune the scheduling of some hand-written assembly.