I have 3 queries to change the COLLATION. They should work but they does not. Looks like only [!varchar] columns by 2nd query are affected. Can anybody tell what is the problem there? I need to convert from utf8_general_ci to utf8_bin. I get results like:
ALTER TABLE AO_21F425_MESSAGE_MAPPING_AO MODIFY MESSAGE_ID varchar CHARACTER SET UTF8 COLLATE utf8_bin NOT NULL;
ALTER TABLE AO_21F425_MESSAGE_MAPPING_AO MODIFY USER_HASH varchar CHARACTER SET UTF8 COLLATE utf8_bin NOT NULL;
ALTER TABLE AO_38321B_CUSTOM_CONTENT_LINK MODIFY LINK_URL varchar CHARACTER SET UTF8 COLLATE utf8_bin;
and so on... but no changes in DB.
1) Change columns with type VARCHAR
SELECT CONCAT('ALTER TABLE `', table_name,
'` MODIFY `', column_name, '` ', DATA_TYPE, '(', CHARACTER_MAXIMUM_LENGTH,
') CHARACTER SET UTF8 COLLATE utf8_bin',
(CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE '' END), ';')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'my_database_name'
AND DATA_TYPE = 'varchar'
AND
(
CHARACTER_SET_NAME != 'utf8'
OR
COLLATION_NAME != 'utf8_bin'
);
2) Change columns with other than VARCHAR type
SELECT CONCAT('ALTER TABLE `', table_name,
'` MODIFY `', column_name, '` ', DATA_TYPE,
' CHARACTER SET UTF8 COLLATE utf8_bin',
(CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE '' END), ';')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'my_database_name'
AND DATA_TYPE != 'varchar'
AND
(
CHARACTER_SET_NAME != 'utf8'
OR
COLLATION_NAME != 'utf8_bin'
);
3) Change table level
SELECT CONCAT('ALTER TABLE ', table_name, ' CHARACTER SET utf8 COLLATE utf8_bin;')
FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
WHERE C.collation_name = T.table_collation
AND T.table_schema = 'my_database_name'
AND
(
C.CHARACTER_SET_NAME != 'utf8'
OR
C.COLLATION_NAME != 'utf8_bin'
);