All of the information you described are normal and expected behavior. Think of the collation as hierarchy. There is a server collation at the top (or root). Then, each database has its own collation. When you create the database, the database inherits the collation of the server. Each object in the database (columns) has its own collation. When you create those columns they inherit the collation of the database. In each case you can specify a different collation.
If you restored a database created on one server to a second server with a different collation, the restored database would have different collation that the server collation.
Only character type columns are subject to the collation property. So for other columns you would see NULL as the collation property.
In your queries, you can force the collation to one or the other. For example:
SELECT * FROM YourTable
WHERE column1 collate SQL_Latin1_General_CP1_CI_AS = column2 collate SQL_Latin1_General_CP1_CI_AS
You can also change the collation of the database (but that won't change the collation of the columns already created. It will affect only columns that you create subsequently).
You can also change the collation of the columns, but you would need to do regression testing to make sure that that does not break anything.