Kodowanie znaków, podobnie jak strefy czasowe, jest stałym źródłem problemów.
To, co możesz zrobić, to szukać dowolnych znaków „wysokich ASCII”, ponieważ są to albo znaki akcentowane LATIN1, albo symbole, albo pierwszy znak wielobajtowy UTF-8. Odróżnienie nie będzie łatwe, chyba że trochę oszukasz.
Aby dowiedzieć się, jakie kodowanie jest poprawne, po prostu SELECT
dwie różne wersje i porównaj wizualnie. Oto przykład:
SELECT CONVERT(CONVERT(name USING BINARY) USING latin1) AS latin1,
CONVERT(CONVERT(name USING BINARY) USING utf8) AS utf8
FROM users
WHERE CONVERT(name USING BINARY) RLIKE CONCAT('[', UNHEX('80'), '-', UNHEX('FF'), ']')
Jest to niezwykle skomplikowane, ponieważ silnik MySQL regexp wydaje się ignorować takie rzeczy jak \x80
i sprawia, że konieczne jest użycie UNHEX()
zamiast tego.
Daje to takie wyniki:
latin1 utf8
----------------------------------------
Björn Björn