Size: a a a

SqlCom.ru - Стиль жизни SQL

2020 August 21

KT

Konstantin Taranov in SqlCom.ru - Стиль жизни SQL
Aleksey S.
не, я к тому, что если я уже записал строку с кириллицей без всяких N' с полем [customer_city] в БД с коллейшеном SQL_Latin1_General_CP1_CI_AS
я не могу почему-то её прочитать даже указав в SELECT явно другой коллейшен
SELECT
[customer_city] COLLATE Cyrillic_General_CI_AS

Оно там внутри, где неонка, вообще лежит нормально или данные так теряются?
Create table сбросьте и через профайлер (по хорошему xe) отловите какой insert в базу прилетает
источник

AS

Aleksey S. in SqlCom.ru - Стиль жизни SQL
питоновский df_machines.to_sql... создает поле типа varchar(max)

я просто пытаюсь прочитать его, задавая для выборки другой коллейшен - и вот это не получается, что меня удивляет
там же внутри просто строка символов должна лежать - как хочу, так и верчу её
источник

OM

Oleg Makarikhin in SqlCom.ru - Стиль жизни SQL
Aleksey S.
Коллеги, с коллейшенами вопрос.
Есть БД, которая заточена под хранение логов, прилетающих из разных стран.
В ней, ессно, могут в некоторых полях быть локальные строчки (не критичные).

В датафрейме питона у меня строка на русском - "Москва"
Я пишу тупо df_machines.to_sql...
и оно автоматом закидывает в таблицу
Питон на utf-8 работает

НО
так как у меня в БД стоит collation не кириллический, а SQL_Latin1_General_CP1_CI_AS - то при выводе на экран в Studio я вижу тупо "??????" вместо кириллицы
хотя поле в БД объявлено как nvarchar, а не varchar

Как правильно в таких случаях делать? Клепать БД на каждую страну - не улыбается.
Задавать отдельный на конкретную таблицу - можно? Тогда хотя бы таблицами поделю.

Но все равно придется по идее, выборки делать из двух таблиц с разными локальными строками.
MS Studio такое никогда не отобразит?
"Москва" или u"Москва" ?
источник

AS

Aleksey S. in SqlCom.ru - Стиль жизни SQL
шоб я знал, думаю, просто "Москва" в utf-8
print(df_machines['city']) - так и выводит, никаких u
тут я не сеньор =)
источник

Д

Денис Лёвкин... in SqlCom.ru - Стиль жизни SQL
Попробовать указать charset=utf8 в строке соединения, может поможет
источник

OM

Oleg Makarikhin in SqlCom.ru - Стиль жизни SQL
Aleksey S.
шоб я знал, думаю, просто "Москва" в utf-8
print(df_machines['city']) - так и выводит, никаких u
тут я не сеньор =)
а вот так выводы разные?
[ord(c) for c in u'Москва']
[ord(c) for c in 'Москва']
источник

AS

Aleksey S. in SqlCom.ru - Стиль жизни SQL
вообще в MS SQL в одном столбце же можно хранить записи в поле nvarchar, которые получены из любых коллейшенов?
вот я не пойму, он их портит при записи или зная коллейшен, их можно обратно считать?

Т.е. условно
есть у меня БД1 где адреса на польском и БД2 где кириллица, и БД3 с иероглифами
я делаю БД4 с условным общим коллейшеном Latin...
и делаю там сводную таблицу UNION ALL из всех этих БД

MS Studio никак не отобразит мне нормально
city_pl
UNION ALL
city_ru
UNION ALL
city_china
?
источник

AS

Aleksey S. in SqlCom.ru - Стиль жизни SQL
Oleg Makarikhin
а вот так выводы разные?
[ord(c) for c in u'Москва']
[ord(c) for c in 'Москва']
принт выводит одинаково:
[1052, 1086, 1089, 1082, 1074, 1072]
[1052, 1086, 1089, 1082, 1074, 1072]
источник

NP

Nick Proskuryakov in SqlCom.ru - Стиль жизни SQL
Aleksey S.
вообще в MS SQL в одном столбце же можно хранить записи в поле nvarchar, которые получены из любых коллейшенов?
вот я не пойму, он их портит при записи или зная коллейшен, их можно обратно считать?

Т.е. условно
есть у меня БД1 где адреса на польском и БД2 где кириллица, и БД3 с иероглифами
я делаю БД4 с условным общим коллейшеном Latin...
и делаю там сводную таблицу UNION ALL из всех этих БД

MS Studio никак не отобразит мне нормально
city_pl
UNION ALL
city_ru
UNION ALL
city_china
?
Да все должно быть ок с COLLATE DATABASE_DEFAULT
источник

OM

Oleg Makarikhin in SqlCom.ru - Стиль жизни SQL
Aleksey S.
принт выводит одинаково:
[1052, 1086, 1089, 1082, 1074, 1072]
[1052, 1086, 1089, 1082, 1074, 1072]
значит в utf8. тогда хз что там легло в базу и почему кириллица побилась. может действительно в строке подключения надо прописывать utf8 ?charset=utf8
источник

KT

Konstantin Taranov in SqlCom.ru - Стиль жизни SQL
Aleksey S.
питоновский df_machines.to_sql... создает поле типа varchar(max)

я просто пытаюсь прочитать его, задавая для выборки другой коллейшен - и вот это не получается, что меня удивляет
там же внутри просто строка символов должна лежать - как хочу, так и верчу её
При чем тогда тут nvarchar? SQL server ничего не портит (ну почти, баги во всех продуктах есть), в вашем случае вы пишите данные в одной кодировке в столбец, который из хранит в другой кодировке. Вам нужно чтобы в таблице было поле nvarchar!
При этом не важно какая котировка будет у сервера и у базы данных.
Также я не уверен что вам нужен тип данных max, у вас там реально безразмерные строки будет храниться?
источник

AS

Aleksey S. in SqlCom.ru - Стиль жизни SQL
max - это питон сам создает, зараза, если ему указать параметром replace
источник

AS

Aleksey S. in SqlCom.ru - Стиль жизни SQL
точнее, так работает dataframe.to_sql в библиотеке pandas если не задавать никаких хитрых параметров

а вот эти параметры я пойду гуглить
источник

Д

Денис Лёвкин... in SqlCom.ru - Стиль жизни SQL
Aleksey S.
точнее, так работает dataframe.to_sql в библиотеке pandas если не задавать никаких хитрых параметров

а вот эти параметры я пойду гуглить
Collation -никак в данном случае не причина. Вот таблица  - и результат. По умолчанию для базы SQL_Latin1_General_CP1_CI_AS
В Nvarchar можно хоть на китайском, не то что на русском
источник

AS

Aleksey S. in SqlCom.ru - Стиль жизни SQL
угу
источник

AS

Aleksey S. in SqlCom.ru - Стиль жизни SQL
, dtype={col_name: NVARCHAR for col_name in df}
источник

AS

Aleksey S. in SqlCom.ru - Стиль жизни SQL
если я в to_sql явно тупо просто перевожу все столбцы в тип NVARCHAR - то "Москва" отлично считывается
источник

AS

Aleksey S. in SqlCom.ru - Стиль жизни SQL
т.е. по умолчанию он делает столбец просто varchar(max) - и тогда я не знаю, во что он превращает "Москва" ))
источник

AS

Aleksey S. in SqlCom.ru - Стиль жизни SQL
спасибо )
задал нварчар для всех нужных столбцов - начало считываться нормально

а теоретически - вот то, что записано "Москва" в столбец типа varchar - это было бы потеряно, или можно восстановить?
у меня что-то CAST и CONVERT и даже с указанием другого коллейшена - никак не считывалось
источник

Д

Денис Лёвкин... in SqlCom.ru - Стиль жизни SQL
коллейшен никак не влияет (ну почти) на хранение. в varchar - все что не unicode.
nvarchar - unicode
https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?redirectedfrom=MSDN&view=sql-server-ver15
источник