Выбор строк из столбца, где некоторые кодируются utf8, а другие нет - PullRequest
1 голос
/ 12 марта 2019

Данные являются названиями подразделений страны.Некоторые были сохранены как utf8, а некоторые нет.Например, вот как они в моей таблице:

statename

Bocas del Toro
Chiriquí
Coclé
Colón
Darién
Veraguas
Panamá Oeste
Emberá
Kuna Yala
Ngöbe-Buglé

Этот вопрос / ответ очень близко помогает мне найти решение: Как исправить символы UTF8 с двойным кодированием (в таблице utf-8)

Если я использую: CONVERT(CAST(CONVERT(statename USING latin1) AS BINARY) USING utf8):

statename

Bocas del Toro
Chiriquí
Coclé
Col
Dari
Veraguas
Panam
Emberá
Kuna Yala
Ng

символы, хранящиеся, например, как "é", просто заканчивайте строку.

Вариант, представленный в этом ответе,

SELECT CASE
    WHEN CONVERT( CAST( CONVERT( statename USING latin1 ) AS BINARY ) USING utf8 ) IS NULL
        THEN statename
    ELSE CONVERT( CAST( CONVERT( statename USING latin1 ) AS BINARY ) USING utf8 )
END
FROM 

вернул тот же результат, хотя я даже не уверен, что правильно реализовал его в этом выборе.

Я неразрешено нормализовать эти данные в этом случае, поэтому я хотел бы выбрать их и получить

Bocas del Toro
Chiriquí
Coclé
Colón
Darién
Veraguas
Panamá Oeste
Emberá
Kuna Yala
Ngöbe-Buglé

Будет ли это возможно?

1 Ответ

0 голосов
/ 12 марта 2019

Это похоже на проблему с SQL_MODE.Чтобы преобразование завершилось неудачно и вернулось режим NULL - STRICT_TRANS_TABLES.Вы можете установить его с помощью

SET SESSION sql_mode = CONCAT('STRICT_TRANS_TABLES,', @@sql_mode);

Если вы не хотите прерывать другие «рабочие» запросы в том же сеансе, вы должны сбросить его после получения результатов:

SET @old_sql_mode = @@sql_mode;
SET SESSION sql_mode = CONCAT('STRICT_TRANS_TABLES,', @@sql_mode);

SELECT COALESCE(
  CONVERT( CAST( CONVERT( statename USING latin1 ) AS BINARY ) USING utf8 ), statename
) as statename
FROM yourTable;

SET SESSION sql_mode = @old_sql_mode;

Демонстрация DB Fiddle

Примечание: я немного изменил ваш запрос, чтобы использовать COALESCE() вместо оператора CASE, поэтому вам не нужно дублировать преобразованиекод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...