After setting up transactional replication on a set of servers with @sync_type = "replication support only" I was receiving errors on validation where the row count was correct but the checksum was not. Meanwhile SQL Data Compare was telling me the tables on each server were exactly the same. This was caused by two issues.
One was that Options -> Force Binary Collation (case-sensitive) is not on by default in SQL Data Compare, so one row of nvarchar data had different case between the servers. I had never seen that before (after more than a year of syncing) and so updated the relevant fields immediately. You might want to check the same if you use this tool.
The other bigger issue was that the built-in replication validation routines require your columns to be of the same type and in the same order on each server - all the types and user-defined types and null/not null settings seemed okay but some servers had columns in a different order. You can identify this by checking the offset field on each server from this query:
Select s.name, s1.name, s1.offset, s1.xoffset From sys.sysobjects s Join sys.syscolumns s1 On s.id = s1.id Where s.name = 'TABLE_NAME' Order By offset
In my case where I had columns Column_1, Column_2, Column_3 on one, I had columns Column_1, Column_3, Column_2 on the other. I wrote a quick query to resolve this specific situation where I could reshuffle the columns by removing Column_3 and re-adding it again:
-- Add the new column, set the contents, then make it not null Alter Table Table_Name Add Column_4 Update Table_Name Set Column_4 = Column_3 Alter Table Table_Name Alter Column Column_4 Not Null -- Remove any foreign keys then do the rename Alter Table Table_Name Drop Column Column_3 Exec sys.sp_rename 'Table_Name.Column_4', 'Column_3', 'column' -- Re-add any foreign keys
If you have foreign keys or indexes or triggers you'd have to include your own code.
After this all columns have the same offset and validation completes successfully. I wasn't sure this would be the case because Microsoft only guaranteed it if you used @sync_type = "auto", and doesn't explicitly state that creating them yourself in the right order will work. Well it does.
I'll also note that Microsoft also states there can be collation issues that affect validation between databases but in my case I have different collations on the databases and they are still validating correctly, at least for my purposes.