Преобразовать базу данных в utf8

Здравствуйте, я пытаюсь преобразовать свою базу данных, одну таблицу и поле в utf, используя этот скрипт.

-- Write a script that converts hbtn_0c_0 database to UTF8
-- (utf8mb4, collate utf8mb4_unicode_ci) in your MySQL server.

-- You need to convert all of the following to UTF8:

--     Database hbtn_0c_0
--     Table first_table
--     Field name in first_table

ALTER DATABASE
      `hbtn_0c_0`
      CHARACTER SET utf8mb4
      COLLATE utf8mb4_unicode_ci;

USE `hbtn_0c_0`;

ALTER TABLE
      `first_table`
      CONVERT TO CHARACTER SET utf8mb4
      COLLATE utf8mb4_unicode_ci;

ALTER TABLE
      `first_table`
      CHANGE `name`
      VARCHAR(256)
      CHARACTER SET utf8mb4
      COLLATE utf8mb4_unicode_ci;

Но у меня ошибка SQL. Пожалуйста помогите

black_genius@genius:~/Documents/ALX_Task/alx-higher_level_programming/0x0D-SQL_introduction$ cat 100-move_to_utf8.sql | mysql -hlocalhost -uroot -p 
Enter password: 
ERROR 1064 (42000) at line 22: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VARCHAR(256)
      CHARACTER SET utf8mb4
      COLLATE utf8mb4_unicode_ci' at line 4

Я использую версию mysql v8.0.31 на Ubuntu 22.10.

Какая кодировка используется сейчас?

Rick James 08.11.2022 23:48
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
1
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда вы изменяете столбец, вам необходимо указать старое имя и новое имя, даже если это одно и то же имя. См. синтаксис в документации :

CHANGE [COLUMN] old_col_name new_col_name column_definition

В вашем случае должно быть

ALTER TABLE
      `first_table`
      CHANGE `name` `name`
      VARCHAR(256)
      CHARACTER SET utf8mb4
      COLLATE utf8mb4_unicode_ci;

Демонстрация: . db-fiddle.com/f/qFuvFqP5PEGbsc8F8DfiaN/0

@RickJames Как так? Если данные были не в формате utf8, они будут преобразованы. db-fiddle.com/f/qFuvFqP5PEGbsc8F8DfiaN/0

Paul Spiegel 09.11.2022 18:53

@RickJames Демонстрация скрипки, которую я разместил в комментарии выше, с вами не согласна. Как и документация: «Для изменения типа данных с помощью CHANGE или MODIFY MySQL пытается преобразовать существующие значения столбца в новый тип, насколько это возможно».

Paul Spiegel 10.11.2022 22:13

Вы правы.

Rick James 10.11.2022 22:28

Вам не нужно менять отдельный столбец, если вы используете ALTER TABLE ... CONVERT TO CHARACTER SET .... Этот ALTER TABLE автоматически преобразует все строковые столбцы.

В документации описаны:

Чтобы изменить набор символов таблицы по умолчанию и все столбцы символов (CHAR, VARCHAR, TEXT) к новому набору символов, используйте такой оператор, как это:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

Оператор также изменяет сопоставление всех столбцов символов.

Ответ Пола Шпигеля о синтаксисе CHANGE COLUMN верен; этот синтаксис позволяет вам изменить имя столбца, поэтому вам нужно указать имя столбца дважды.

Альтернативой является использование MODIFY COLUMN вместо CHANGE COLUMN. Это позволяет изменить тип и параметры столбца, включая набор символов, но не изменить имя столбца. Таким образом, нет необходимости дважды указывать имя столбца.

ALTER TABLE
      `first_table`
      MODIFY `name`
      VARCHAR(256)
      CHARACTER SET utf8mb4
      COLLATE utf8mb4_unicode_ci;

Но опять же, в вашем примере нет необходимости использовать ни CHANGE COLUMN, ни MODIFY COLUMN. Преобразование набора символов должно быть достигнуто с помощью действия CONVERT TO CHARACTER SET.

Другие вопросы по теме