Как из powershell скрипта записать кириллицу в MySQL (UTF-8)?

182
23 апреля 2022, 22:30

Есть столбец таблицы с кодировкой utf8 (менять кодировку нельзя).

Написал скрипт который заполняет этот столбец кириллицей(использую MySql.Data.dll). В результате в таблице получаю знаки вопросов '?????' вместо данных. При этом латиница записывается корректно.
И при отладке в переменных всё ОК.

Файл скрипта в кодировке UTF-8 с BOM (простой utf8 powershell не понимает). Перед записью данных сообщаю серверу MySQL в какой кодировке будут данные

SET NAMES utf8

Подозреваю дело в самом POWERSHELL по тому пробовал:

[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("UTF-8")   

и

chcp 65001

После чего:

[Console]::OutputEncoding

показывает:

BodyName          : utf-8
EncodingName      : Unicode (UTF-8)
HeaderName        : utf-8
WebName           : utf-8
WindowsCodePage   : 1200
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
IsSingleByte      : False
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : False
CodePage          : 65001

Все выше перечисленное тщетно а GOOGLE ответа не даёт. Надеюсь на вашу помощь ;)

P.S. Набросал код, что бы можно было воспроизвести проблему (для работы понадобится клиент MySQL):

[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("UTF-8") 
chcp 65001
Add-Type -Path "C:\Program Files (x86)\MySQL\MySQL Connector Net 8.0.18\Assemblies\v4.5.2\MySql.Data.dll"
$connector = New-Object MySql.Data.MySqlClient.MySqlConnection("Server=SERVER_NAME;uid=USER;pwd=PASSWORD;database=DB_NAME;Port=3306")
$connector.Open()
$cmd = New-Object MySql.Data.MySqlClient.MySqlCommand
$cmd.Connection = $connector
$cmd.CommandType = [System.Data.CommandType]::Text
$cmd.CommandText =  "SET NAMES utf8"
$cmd.ExecuteNonQuery()
$cmd.CommandText = "INSERT INTO tbl_name (col1) VALUES('Тут что-то по русски, сцк !')"
$cmd.ExecuteNonQuery()
$connector.Close()
Answer 1

Спасибо PotroNik за подсказку !
Действительно нужно было сказать клиенту MySQL в какой кодировке передавать данные (по умолчанию кодировка системы)
В строку MySqlConnection необходимо добавить charset=utf8.

$connector = New-Object MySql.Data.MySqlClient.MySqlConnection("Server=SERVER_NAME;uid=USER;pwd=PASSWORD;database=DB_NAME;Port=3306";charset=utf8)
READ ALSO
Строение таблицы в БД

Строение таблицы в БД

делаю периодически БД(Mysql) для интернет-магазинов, новостных сайтов и тд

214
mysql если совпадает весь список

mysql если совпадает весь список

Есть две таблицыНужно сделать выборку при условии что есть полное совпадение по ключам

181