As you see, when you assign "True" to variant, then this variant to integer, you get "-1"
Yes, apparently variants have the same "problem" as wordbool. Although, like taazz mentioned, this might be expected behavior (because of the max(type) conversion) for booleans and variants and like you say further on (0=False and other value=True). But when a database dictates that 1 is true it should be followed as such (regardless what any language would dictate as TRUE).
So seems to me 0=False, other value=True ?
Yes, that's the correct definition I've found, too. Except for SQLite (and maybe other DB-engines). When storing -1 as boolean (/integer) it will not find it when checking for 1. So SELECT * FROM table WHERE boolean_value = -1 will not give the records with 1 (and visa versa). And that's a problem when you have an existing database with correct 1 values. Now for hardcoded SQL this wouldn't be a problem because you could say "boolean_value <> 0" (like the definition in Lazarus for boolean) but...
This problem would also exists for a prameter-query:
SELECT * FROM table WHERE boolean_value = :param
Although Lazarus might implement the boolean parameter as "(value <> 0)", the database engine has not. And the "WHERE boolean_value = :param" is check on the server-side. So having 1 or -1 (or -99 or 99 for that matter) is a problem for database-engines because you can't check for booleans with ONE parameterized statement. You would always need to have 2 statements:
SELECT * FROM table WHERE boolean_value = 0
SELECT * FROM table WHERE boolean_value <> 0
Of course, the storing of 1 for TRUE should only be changed if you're sure every database (which stores a boolean as an integer) does expect a 1 (instead of a -1). Otherwise these changes should only be implemented for the SQLite-library. (How many SQL-engines store an integer for boolean value??)
Finally, for all those having multiple values (1 and -1) for boolean already in their database, checking for ABS(boolean_value) <> 0 is the safest course. So everyone using check booleans in databases with "integer as boolean" should be aware of this change, so they can check it like that (ABS(X)), too. Or they should run a "fix" on their databases to change all the -1 back to the correct 1's.
(I didn't even mention other programs querying the database and expecting 1 for TRUE)