SASGIS - SAS.Планета
View Issue Details
0003168SAS.Планета[All Projects] Багpublic09-01-2017 10:3412-01-2017 19:01
Desert Rat 
zed 
normalminoralways
closedno change required 
Windows7Ultimate
.Nightly 
 
0003168: Не работают метки в MySQL через ODBC
При использовании ODBC MySQL (5.1 5.2 5.3) БД создается не до конца и с ошибками. Причиной является пустой параметр имени в БД.
select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, 0 INDEX_COUNT from INFORMATION_SCHEMA.COLUMNS where UPPER(TABLE_SCHEMA) = '' and UPPER(TABLE_NAME) = 'USER'

При использовании Connection String:
select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, 0 INDEX_COUNT from INFORMATION_SCHEMA.COLUMNS where UPPER(TABLE_SCHEMA) = 'DRIVER={MYSQL ODBC 5.3 ANSI DRIVER};SERVER=localhost;DATABASE=SASPLANET;UID=root;PASSWORD=root;' and UPPER(TABLE_NAME) = 'USER'
1. Установить 5.3 ODBC MySQL Driver
2. Настроить ODBC в Windows через Источник Данных ODBC
3. Включить global_log в MySQL
4. Использовать ODBC в SasPlanet
SET NAMES utf8
SET character_set_results = NULL
SET SQL_AUTO_IS_NULL = 0
set @@sql_select_limit=DEFAULT
select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, 0 INDEX_COUNT from INFORMATION_SCHEMA.COLUMNS where UPPER(TABLE_SCHEMA) = '' and UPPER(TABLE_NAME) = 'USER'

SELECT TABLE_NAME, TABLE_COMMENT, TABLE_TYPE, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND ( TABLE_TYPE='BASE TABLE' OR TABLE_TYPE='VIEW' ) AND TABLE_NAME LIKE 'USER'

SELECT TABLE_NAME, TABLE_COMMENT, TABLE_TYPE, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND ( TABLE_TYPE='BASE TABLE' OR TABLE_TYPE='VIEW' ) AND TABLE_NAME LIKE 'USER'

CREATE TABLE User (ID bigint NOT NULL,uName mediumtext character set UTF8, PRIMARY KEY(ID))

select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, 0 INDEX_COUNT from INFORMATION_SCHEMA.COLUMNS where UPPER(TABLE_SCHEMA) = '' and UPPER(TABLE_NAME) = 'USER'

SELECT TABLE_NAME, TABLE_COMMENT, TABLE_TYPE, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND ( TABLE_TYPE='BASE TABLE' OR TABLE_TYPE='VIEW' ) AND TABLE_NAME LIKE 'USER'

SHOW KEYS FROM `USER`
SHOW KEYS FROM `USER`
No tags attached.
png Image 1.png (22,728) 12-01-2017 11:42
https://bugtracker.sasgis.org/file_download.php?file_id=2135&type=bug
png

png Image 2.png (8,875) 12-01-2017 11:43
https://bugtracker.sasgis.org/file_download.php?file_id=2136&type=bug
png

png Image 3.png (9,683) 12-01-2017 15:39
https://bugtracker.sasgis.org/file_download.php?file_id=2137&type=bug
png
Issue History
09-01-2017 10:34Desert RatNew Issue
12-01-2017 11:33zedSummaryODBC MySQL не рабочий => Не работают метки в MySQL через ODBC
12-01-2017 11:42zedNote Added: 0017771
12-01-2017 11:42zedFile Added: Image 1.png
12-01-2017 11:43zedFile Added: Image 2.png
12-01-2017 11:44zedStatusnew => feedback
12-01-2017 11:51zedNote Edited: 0017771bug_revision_view_page.php?bugnote_id=17771#r7118
12-01-2017 13:47Desert RatNote Added: 0017772
12-01-2017 13:47Desert RatStatusfeedback => new
12-01-2017 15:39zedNote Added: 0017773
12-01-2017 15:39zedFile Added: Image 3.png
12-01-2017 15:40zedStatusnew => feedback
12-01-2017 16:05Desert RatNote Added: 0017774
12-01-2017 16:05Desert RatStatusfeedback => new
12-01-2017 16:07zedNote Added: 0017775
12-01-2017 18:43Desert RatNote Added: 0017776
12-01-2017 19:00zedNote Added: 0017777
12-01-2017 19:01zedStatusnew => closed
12-01-2017 19:01zedAssigned To => zed
12-01-2017 19:01zedResolutionopen => no change required
12-01-2017 19:01zedNote Edited: 0017777bug_revision_view_page.php?bugnote_id=17777#r7120

Notes
(0017771)
zed   
12-01-2017 11:42   
(edited on: 12-01-2017 11:51)
У меня всё работает. Опишу подробно:

1. Установить 32-битный драйвер 5.3.7
2. Запустить сервер:

mysqld --skip-grant-tables --console --verbose --max_allowed_packet=16M

3. Создать БД:

mysql -vvvv -u root -e "CREATE DATABASE IF NOT EXISTS sasgis_marks CHARACTER SET utf8 COLLATE utf8_general_ci;"

4. В "Администрирование - Источники данных ODBC (32-разрядная версия)" добавить новый источник: "MySQL ODBC Unicode Driver" с настройками как на скриншоте "Image 1.png"
5. В SAS создать новую БД меток с настройками как на скриншоте "Image 2.png"

Сервер 5.6.26 (32-битный) на Windows 8.1 x64.

(0017772)
Desert Rat   
12-01-2017 13:47   
Сервер Ubuntu 14.04.1 i686. mysqld 5.5.53.

Клиенты:
Win 7 x64. Stable 160707.9476. mysql-connector-odbc-5.3.7-win32
Win 10 x64. Nightly 161222.9650. mysql-connector-odbc-5.3.7-win32

Оба клиента не могут создать правильно таблицы изза неверных запросов в SQL. SQL рабочий, так как на нем крутятся несколько сервисов. БД создавалось как указанно в прошлом комментарии. Источник данных был задан через "Источники данных ODBC". Настроено как на скриншоте.

ESQLite3Exception: Error SQLITE_ERROR (1) [Step] using 3.13.0 - TSQLRestStorageExternal.Create: TSQLUser: unable to create external missing field User.uName - SQL="ALTER TABLE User ADD uName mediumtext character set UTF8"

Если удалить поле uName, создается следующая таблица, и так же с ошибкой.
(0017773)
zed   
12-01-2017 15:39   
> Оба клиента не могут создать правильно таблицы изза неверных запросов в SQL

Значит, при работе с MySQL 5.5.x и младше, надо использовать Connection String в настройках SAS, а не DSN.
(0017774)
Desert Rat   
12-01-2017 16:05   
При первом запуске создалась только таблица User и та же ошибка. При повторных другая ошибка.

Driver={MySQL ODBC 5.3 UNICODE Driver};Server=192.168.0.1;Database=sasplanet;User=root;password=root;

ESQLite3Exception: Error SQLITE_ERROR (1) [Step] using 3.13.0 - TSQLRestStorageExternal.Create: external table creation TSQLUser failed: GetFields() returned nil - SQL="User", extended_errcode=1

SET NAMES utf8
SET character_set_results = NULL
SET SQL_AUTO_IS_NULL = 0
set @@sql_select_limit=DEFAULT

select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, 0 INDEX_COUNT from INFORMATION_SCHEMA.COLUMNS where UPPER(TABLE_SCHEMA) = 'Driver={MySQL ODBC 5.3 UNICODE Driver};Server=192.168.0.1;Database=sasplanet;User=root;password=root;' and UPPER(TABLE_NAME) = 'USER'

SELECT TABLE_NAME, TABLE_COMMENT, TABLE_TYPE, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND ( TABLE_TYPE='BASE TABLE' OR TABLE_TYPE='VIEW' ) AND TABLE_NAME LIKE 'USER'

Field List User
SHOW KEYS FROM `USER`
SHOW KEYS FROM `USER`
CREATE TABLE User (ID bigint NOT NULL,uName mediumtext character set UTF8, PRIMARY KEY(ID))
ALTER TABLE User ADD uName mediumtext character set UTF8
Quit

1й селект не валидный.
2й селект:
+------------+---------------+------------+--------------+
| TABLE_NAME | TABLE_COMMENT | TABLE_TYPE | TABLE_SCHEMA |
+------------+---------------+------------+--------------+
| User | | BASE TABLE | sasplanet |
+------------+---------------+------------+--------------+

SHOW KEYS FROM `USER`
Table 'sasplanet.USER' doesn't exist

Но если SHOW KEYS FROM `User'
приходит валидный результат
(0017775)
zed   
12-01-2017 16:07   
Значит, с версией 5.5 оно вообще не работает. Тестируйте на 5.6.
(0017776)
Desert Rat   
12-01-2017 18:43   
Переход на 5.7 не дал результата.
А вот выставление в конфиге MySQL lower_case_table_names = 1; решил проблема.
MySQL в Linux case sensetive в отношении имен таблиц. А в Win нет.
(0017777)
zed   
12-01-2017 19:00   
(edited on: 12-01-2017 19:01)
Хорошо, что есть такая опция и плохо, что по дефолту разное поведение на разных платформах.

Добавлю ещё ссылку на доки, про чувствительность к регистру, может кому пригодится: 10.2.2 Identifier Case Sensitivity