Проблема с кодировкой

D
На сайте с 28.06.2008
Offline
976
387

Пытаюсь импортнуть баз городов по методу описанному тут https://anton.logvinenko.site/ru/blog/geo-bazyi-dannyih.html

Все проходит успешно за исключением того что русские названия становятся карабозяками.

Вроде смотрю код скрипта - при создании таблицы указывается утф 8

/usr/bin/mysql $@ -e 'CREATE DATABASE IF NOT EXISTS '$database';
USE '$database'; CREATE TABLE IF NOT EXISTS '$table' (
`geonameid` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(200) DEFAULT NULL,
`asciiname` varchar(200) DEFAULT NULL,
`alternatenames` varchar(5000) COLLATE utf8_unicode_ci DEFAULT NULL,
`latitude` double DEFAULT NULL,
`longitude` double DEFAULT NULL,
`feature_class` varchar(1) DEFAULT NULL,
`feature_code` varchar(10) DEFAULT NULL,
`country_code` varchar(2) DEFAULT NULL,
`cc2` varchar(2) DEFAULT NULL,
`admin1_code` varchar(20) DEFAULT NULL,
`admin2_code` varchar(80) DEFAULT NULL,
`admin3_code` varchar(20) DEFAULT NULL,
`admin4_code` varchar(20) DEFAULT NULL,
`population` bigint(8) DEFAULT NULL,
`elevation` int(11) DEFAULT NULL,
`dem` int(11) DEFAULT NULL,
`timezone` varchar(40) DEFAULT NULL,
`modification_date` date DEFAULT NULL,
PRIMARY KEY (`geonameid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;'

Скачал базу вручну., посмотрел нотепадом - название нормальные.

Как победить баг?

Почему данные прилетают в кодировке CP1252 ?

Алеандр
На сайте с 08.12.2010
Offline
119
#1

Можно попробовать проверить кодировку файла, иногда сохраняется не в той. Ну и перед командой создания/импорта данных добавить команду, принудительно переводящую базу в работу с нужной кодировкой:

SET NAMES 'utf8';

Также можно для секции конфигурации прописать:

[mysqld]
character_set_connection=utf8

и рестартануть мускуль.

D
На сайте с 28.06.2008
Offline
976
#2
Алеандр:
Можно попробовать проверить кодировку файла, иногда сохраняется не в той. Ну и перед командой создания/импорта данных добавить команду, принудительно переводящую базу в работу с нужной кодировкой:
SET NAMES 'utf8';Куда точно прописать подскажите?
Алеандр:


Также можно для секции конфигурации прописать:
[mysqld]
character_set_connection=utf8


и рестартануть мускуль.

Попробовал - не помогло

Алеандр
На сайте с 08.12.2010
Offline
119
#3
Dram:
Попробовал - не помогло

Перед CREATE TABLE IF NOT EXISTS ...

Будет

SET NAMES 'utf8'; CREATE TABLE IF NOT EXISTS ...

А, только там может быть по строке проблема с кавычками, тогда без них, просто

SET NAMES utf8; CREATE TABLE IF NOT EXISTS ...

---------- Добавлено 26.07.2019 в 19:37 ----------

Посмотрел, там для загрузки распарса другая команда:

$@ --local-infile=1 -e "USE $database; TRUNCATE $table; LOAD DATA LOCAL INFILE

Так что нужно в нее добавить names:

$@ --local-infile=1 -e "USE $database; TRUNCATE $table; SET NAMES utf8; LOAD DATA LOCAL INFILE ..

Попробуйте так изменить скрипт.

---------- Добавлено 26.07.2019 в 19:42 ----------

Ну и последнее, на самом деле импорт может быть проходит как положено. А вот выводится неверно. Часто на сайте для вывода используется указание этой же SET NAMES utf8; в сессии перед получением данных. Т.е. сначала открывается коннект к базе, затем указание кодировки, затем сам select данных.

D
На сайте с 28.06.2008
Offline
976
#4

Я смотрю напрямую в базе что записалось.

К сожалению изменения скрипта тоже не помогло.

---------- Добавлено 26.07.2019 в 20:10 ----------

Решил проблему так:

Вместо

SET NAMES utf8

надо было прописать

SET character_set_database = utf8

Алеандр
На сайте с 08.12.2010
Offline
119
#5

По сути еще раз указали кодировку базы.

Ну да ладно, главное, что нашли решение.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий