#c# #mysql #asp.net
#mysql #utf-8 #кодировка символов #mysql-5.6 #utf8mb4
Вопрос:
Для того, чтобы использовать 4-байтовый utf8mb4
в MySQL (5.6.11), я установил следующие переменные в my.ini
файле ( my.cnf
не найден). Этот файл находится в скрытой папке с именем Application Data
( C:Documents and SettingsAll UsersApplication DataMySQLMySQL Server 5.6
) в Windows XP. Он недоступен в каталоге установки.
[client]
port=3306
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4
А затем выполнить следующую команду,
SHOW VARIABLES
WHERE Variable_name
LIKE 'character_set_%'
OR Variable_name LIKE 'collation%';
по-прежнему отображается следующий список.
Из самой картинки видно, что несколько переменных все еще используют 3-байтовые utf8
.
Перед выполнением этого уже была выдана следующая команда для внесения соответствующих изменений в саму базу данных.
ALTER DATABASE database_name
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
И следующая команда также была выдана для каждой таблицы в указанной базе данных.
ALTER TABLE table_name
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
Тем не менее, в чем причина, по которой некоторым переменным еще не присвоен указанный набор символов, а также параметры сортировки? Чего не хватает?
Сама система (операционная система) была перезапущена после выполнения каждой отдельной задачи, указанной выше.
Комментарии:
1. Внимание: user=root (или другой суперпользователь) не будет выполняться
init-connect='SET NAMES utf8mb4'
.
Ответ №1:
Клиент обычно устанавливает эти значения при подключении. Настройки в my.ini — это просто значения по умолчанию, которые применяются, когда клиент явно не указывает кодировку соединения. Поскольку они ненадежны, каждый клиент должен указать кодировку соединения. Поскольку у вас есть какой-то необычный скриншот, я предполагаю, что вы подключаетесь к какой-то утилите GUI, которая, вероятно, явно устанавливает некоторые кодировки соединения.
PHP пример установки кодировки соединения:
new PDO('mysql:host=localhost;charset=utf8mb4')
Комментарии:
1. Итак, о них в принципе не стоит беспокоиться? Я создал пул соединений со стороны Java, где были установлены некоторые параметры, такие как
characterEncoding
значениеUTF-8
,useUnicode
значениеtrue
иcharacterSetResults
значениеUTF-8
. Они в основном служат целям параметров, которые добавляются к строке подключения с той же парой имя / значение. (Снимок экрана был взят из MySQL WorkBench. Терминал MySQL не открывался по некоторым неясным причинам, так как MySQL был установлен. Он просто вспыхивает на некоторое время и исчезает приmysql.exe
двойном щелчке. Итак, я использую WorkBench)2. Если ваш фактический клиент собирается объявить свою собственную
utf8mb4
кодировку соединения, то да, об этом не стоит беспокоиться. Вам не нужно трогать мой. ini вообще для запуска рабочего процесса utf8mb4.3. Мне удалось каким-то образом запустить командную строку MySQL. Он устанавливает эти значения только
utf8mb4
тогда, когдаskip-character-set-client-handshake
используется. В MySQL WorkBench требуется выполнить ручную командуSET NAMES 'utf8mb4';
, которая преобразует все эти значения вutf8mb4
, но все равно оставляетcollation_connection
его значениеutf8mb4_general_ci
.character_set_system
с другой стороны, остается неизменным во всех случаях доutf8
.4. @Tiny есть какой-нибудь способ настроить Mysql Workbench на использование utf8mb4 по умолчанию, чтобы при каждом подключении не нужно было выдавать имена наборов utf8mb4?
Ответ №2:
Если вы покажете свои глобальные переменные, вы можете увидеть, что все ваши настройки на самом деле верны.
SHOW GLOBAL VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
Это может быть связано с этой ошибкой, я также сталкивался с той же проблемой в прошлом. Я изменил кодировку БД с utf8 на utf8mb4. Выполнение запросов непосредственно из командной строки mysql было в порядке, но у меня возникла проблема с вставкой смайликов в Workbench. В итоге я установил его вручную, выполнив
SET NAMES 'utf8mb4'
каждый раз, когда я открываю соединение с моей базой данных с помощью Workbench.
Использование Sequel Pro в качестве альтернативы также было в порядке.
Ответ №3:
Я думаю, что вы подключаетесь как root, следовательно init-connect='SET NAMES utf8mb4'
, не выполняется.
Неразумно использовать root (или SUPER) для любого кода приложения; только для административных действий.
Комментарии:
1. Я нигде не читал: » Неразумно использовать root (или SUPER) для любого кода приложения «. Я интерпретировал » код приложения » как клиентские приложения, такие как Java / PHP / ASP.NET или что-то еще. Означает ли это, что всегда следует настаивать на создании другого / других пользователей, если кто-то хочет использовать MySQL через клиентские приложения, которые должны обращаться к базе данных / базам данных от этого другого пользователя, а не от пользователя root?
2. Это общая проблема безопасности. Если хакер может проникнуть в клиент и узнать пароль root, то он может уничтожить не только базу данных, но, возможно, и компьютер, на котором она находится. И, если у вас несколько пользователей, лучше сделать некоторую изоляцию между ними. Под кодом приложения я подразумеваю как конечных пользователей (у которых обычно вообще не должно быть входа в mysql), Так И уровни приложений (Java и т. Д.), Которые действуют от их имени.
3. И, возможно, вы нашли малоизвестное предостережение о
root
пропускеinit-connect
?4.
utf8mb4
кажется, что он установлен, когдаskip-character-set-client-handshake
используется. Я даже не знаю, что это значит (я думаю, что его использование не рекомендуется). СУБД — это то, что далеко за пределами меня 🙂
Ответ №4:
На win7
-
используйте «win R» и введите «services.msc»
-
найти службу mysql
-
проверьте путь к файлу. Он сообщит вам, где находится файл my.ini
-
откройте и добавьте некоторые свойства:
[клиент] набор символов по умолчанию = utf8mb4
[mysql] набор символов по умолчанию = utf8mb4
[mysqld] набор символов-клиент-рукопожатие = FALSE набор символов-сервер = utf8mb4 сопоставление-сервер = utf8mb4_unicode_ci
-
перезапустите службу mysql