You may need to check if one, or possibly both, of the data sets have leading spaces. Many ways of displaying data, Proc Print for example, will left justify things so that the leading spaces don't display.
You don't indicate how big your data set is but running this (removing the match requirement)
DATA three;
MERGE one (in=a) two (in=b);
BY Borrower_ID2;
/*if a and b;*/
run;
If you find the suspect ID values on multiple lines not together that is an indicator of likely issues. Another possibility is differences in case, 84F3G vs 84f3g
I might suggest to remove possible spaces. If you see case differences then make all the values upper or lower case, your choice.
data one;
set one_raw;
keep Borrower_ID2;
Borrower_ID2= strip(Borrower_ID2);
format Borrower_ID2 $9.;
run;
data two;
set two_raw;
keep Borrower_ID2;
Borrower_ID2= strip(Borrower_ID2);
format Borrower_ID2 $9.;
run;
Note: The format assigned to a variable doesn't make any difference for this sort of comparison. Equals is equals.
Lengths might have an affect depending on the content of the values. Consider:
data example1;
x='ABCDEF ';
format x $25.;
run;
data example2;
x='ABCDEF ';
format x $15.;
run;
data examplemerge;
merge example1 example2;
by x;
run;
Different defined lengths with the values for the first few characters the same, different formats, but the merge works as desired (in this limited and contrived case) though the log does show a warning about the different lengths because there is a possibility of unexpected results and which data set controls the resulting format.