"Неправильне значення рядка" при спробі вставити UTF-8 в MySQL через JDBC?


228

Ось так встановлено моє з'єднання:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);

І я отримую таку помилку під час введення тексту, щоб додати рядок до таблиці:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1

Я вставляю тисячі записів, і я завжди отримую цю помилку, коли текст містить \ xF0 (тобто неправильне значення рядка завжди починається з \ xF0).

Порівняння стовпця - utf8_general_ci.

У чому може бути проблема?


Це було б СУЧАСНЕ МАЛЕ ПІСЛЕННЯ Н З ТИЛДЕ (ñ).
andreszs

Для інших, що стикаються з цим питанням, ви можете спробувати: У базі даних: ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - Він вирішить створені таблиці "відтепер". НЕ для таблиць EXIST. Для них вам потрібно зробити: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Джерело - digitalocean.com/community/questions/…
lingar

Відповіді:


321

MySQL utf8дозволяє лише символи Unicode, які можуть бути представлені 3 байтами в UTF-8. Тут у вас є символ, якому потрібно 4 байти: \ xF0 \ x90 \ x8D \ x83 ( U + 10343 ГОТИЧНЕ ПІСЛЯ ПОВІТРЯ ).

Якщо у вас MySQL 5.5 або пізнішої версії, ви можете змінити кодування стовпців utf8на utf8mb4. Це кодування дозволяє зберігати символи, які займають 4 байти в UTF-8.

Ви можете також встановити властивість сервера , character_set_serverщоб utf8mb4у файлі конфігурації MySQL. Здається, що Connector / J за умовчанням встановлює 3-байтний Unicode :

Наприклад, для використання 4-байтних наборів символів UTF-8 за допомогою Connector / J, налаштуйте MySQL-сервер character_set_server=utf8mb4і не characterEncodingвийдіть із рядка з'єднання Connector / J. Потім Connector / J автоматично визначить налаштування UTF-8.


151
Який дивний вибір мати utf8 насправді означає "підмножину UTF8, яка може бути представлена ​​в 3 байти".
Ерік Дж.

4
character_encoding_serverневірно ім'я змінної конфігурації MySQL. Я спробував встановити , character_set_serverщоб utf8mb4замість цього, на додаток до окремих колонках, але це нічого не змінило.
Ромен Паулюс

20
# Для кожної бази даних: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; # Для кожної таблиці: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # Для кожного стовпця: ALTER TABLE table_name CHENGE_name_name column_name VARCHAR (191) SET CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
iKing

14
Дивно, що UTF-8 не є UTF-8, поки його не оновлять до UTF-8
Klors

3
Отже, ви припускаєте, що UTF-8 з 3 (трьома байтами) не може зберігати LATIN МАЛИЙ ПІСЛЯ N TILDE (ñ), і нам потрібно 4 (чотири) байти, щоб правильно написати "España"? Дійсно? Чи може вона бути неефективною від цього? Що ми можемо зберігати, крім AZ та 0-9, з 3 байтами тоді ..
andreszs

95

Рядки, які містять \xF0просто символи, закодовані у вигляді декількох байтів за допомогою UTF-8.

Хоча для вашого зіставлення встановлено значення utf8_general_ci, я підозрюю, що кодування символів бази даних, таблиці або навіть стовпця може відрізнятися. Вони є незалежними налаштуваннями . Спробуйте:

ALTER TABLE database.table MODIFY COLUMN col VARCHAR(255)  
    CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

Замініть будь-який фактичний тип даних для VARCHAR (255)


4
Насправді спробував це, не вийшло. Тип даних стовпця - LONGTEXT btw, якщо це має значення.
Ліор

1
Ваш додаток на Java, я його беру? Спробуйте викликати Java за допомогою file-encodingпараметра, що визначає UTF-8, наприклад, java -Dfile.encoding=UTF-8або додайте відповідний перемикач у свій конфігураційний файл Tomcat (тощо).
Ерік Дж.

1
Я пропоную вам поставити акцент на "кодування символів бази даних, таблиці або навіть стовпця може бути різним" . Це найголовніше.
Геллі Енн

Вам доведеться також змінити таблицю з CHARACTER SET utf8 COLLATE utf8_general_ci, після зміни стовпця CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
Sharma

68

У вас є та сама проблема, щоб зберегти дані з utf8mb4потребами, щоб переконатися:

  1. character_set_client, character_set_connection, character_set_resultsє utf8mb4: character_set_clientі character_set_connectionвказують набір символів, у яких оператори надсилаються клієнтом, character_set_resultsвказує набір символів, в яких сервер повертає клієнту результати запиту.
    Див. З'єднання з діаграмою .

  2. кодування таблиці та стовпців є utf8mb4

Для JDBC є два рішення:

Рішення 1 (потрібно перезапустити MySQL):

  1. змінити, my.cnfяк описано нижче, та перезапустити MySQL:

    [mysql]
    default-character-set=utf8mb4
    
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    

це може переконатися, що база даних character_set_client, character_set_connection, character_set_resultsє і utf8mb4за замовчуванням.

  1. перезапустити MySQL

  2. змінити кодування таблиці та стовпців на utf8mb4

  3. СТОП вказівки characterEncoding=UTF-8і characterSetResults=UTF-8в JDBC роз'єм, причиною цього буде перекривати character_set_client, character_set_connection, character_set_resultsщобutf8

Рішення друге (не потрібно перезавантажувати MySQL):

  1. змінити кодування таблиці та стовпців на utf8mb4

  2. вказуючи characterEncoding=UTF-8в роз'ємі jdbc, тому що з'єднувач jdbc не підтримує utf8mb4.

  3. написати такий sql-статтю так (потрібно додати allowMultiQueries=trueдо з'єднувача jdbc):

    'SET NAMES utf8mb4;INSERT INTO Mytable ...';

це переконається, що кожне з'єднання з сервером character_set_client,character_set_connection,character_set_resultsє utf8mb4.
Також дивіться з'єднання з допомогою шаблону .


3
Точка 3 стала для мене клінікою в поєднанні зі зміною кодування db, таблиці та поля: "SET NAMES utf8mb4; INSERT INTO Mytable ...";
kbbucks

Точка 3 також зробила трюк і для мене, моє кодування таблиці вже встановлено на utf8mb4.
Sir_Faenor

Кодування таблиці - це лише за замовчуванням. Досить змінити кодування стовпців на utf8mb4.
Рік Джеймс

Другий підхід слід використовувати вибірково, тобто ніколи не застосовуватись до SELECTзапитів, оскільки set names utf8mb4; select ... from ...ніколи не призведе до ResultSetа, а натомість призведе до ResultSet is from UPDATE. No Data.помилки.
Бас

рішення 2, просто абз. 1 допоміг мені, коли я намагався вставити текст кирилиці через свою контактну форму.
Вадим Анісімов

15

Я хотів об'єднати пару публікацій, щоб отримати повну відповідь на це, оскільки, здається, це кілька кроків.

  1. Вище поради від @madtracey

/etc/mysql/my.cnf або /etc/mysql/mysql.conf.d/mysqld.cnf

[mysql]
default-character-set=utf8mb4

[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
##
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Знову ж із порад, перш за все, jdbc-з'єднань було characterEncoding=UTF-8і characterSetResults=UTF-8видалено з них

З цим набором -Dfile.encoding=UTF-8не було значення.

Я все ще не міг записати міжнародний текст у db, отримуючи такий самий збій, як вище

Тепер за допомогою цього способу перетворення-на-ціле-mysql-бази даних-набору символів-і-зіставлення-до-utf-8

Оновіть всі свої db для використання utf8mb4

ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Запустіть цей запит, який дає вам те, що потрібно передзвонити

SELECT CONCAT(
'ALTER TABLE ',  table_name, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  ', 
'ALTER TABLE ',  table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  ')
FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
WHERE C.collation_name = T.table_collation
AND T.table_schema = 'YOURDB'
AND
(C.CHARACTER_SET_NAME != 'utf8mb4'
    OR
 C.COLLATION_NAME not like 'utf8mb4%')

Скопіюйте вихід пасти в редактор замініть всі | без нічого відправити повідомлення в mysql, коли він підключений до виправлення db.

Це все, що довелося зробити, і все, здається, працює на мене. Не - Dfile.encoding=UTF-8- не ввімкнено, і, здається, працює як очікувалося

У E2A все ще виникає проблема? Я, звичайно, перебуваю на виробництві, тож виявляється, що вам потрібно перевірити, що було зроблено вище, оскільки це іноді не працює, ось причина і виправлення в цьому сценарії:

show create table user

  `password` varchar(255) CHARACTER SET latin1 NOT NULL,
  `username` varchar(255) CHARACTER SET latin1 NOT NULL,

Ви можете бачити, що деякі з латині намагаються оновити запис вручну:

ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

Тож давайте звузимо це:

mysql> ALTER TABLE user change username username varchar(255) CHARACTER SET utf8mb4 not NULL;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
mysql> ALTER TABLE user change username username varchar(100) CHARACTER SET utf8mb4 not NULL;
Query OK, 5 rows affected (0.01 sec)

Коротше кажучи, мені довелося зменшити розмір цього поля, щоб заставити оновлення працювати.

Тепер, коли я бігаю:

mysql> ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

Це все працює


Запитання: остання команда ALTER TABLE перетворить вміст усіх полів VARCHAR у дійсну, справжню кодовану рядок UTF8? Я запитую, тому що у мене виникають проблеми з перетворенням моїх полів LATIN1 в UTF8, зокрема, коли ñ символ знайдений, конверсія безпосередньо провалюється через неправильне значення рядка (помилка 1366).
andreszs

якщо ви маєте на увазі ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;досить дивно, коли я запускав це останній раз, у всіх полях більше не було визначено набір символів. тому пароль зверху став passwordvarchar (255) NOT NULL, (нічого про кодування). Це означає, що остання команда просто повинна була здійснити пошук mysql, що таке фактичне визначення таблиці, і тому що тепер таблиця за замовчуванням цим полям більше не потрібна - я припускаю, що вони залишилися з набором символів просто тому, що під час скидання оновлень цілої таблиці він не зміг його оновити, і тому він залишився в такому стані
VH

7

У моєму випадку я спробував усе вище, нічого не вийшло. Я майже впевнений, моя база даних виглядає нижче.

mysql  Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using  EditLine wrapper

Connection id:      12
Current database:   xxx
Current user:       yo@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.17-0ubuntu0.16.04.1 (Ubuntu)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/run/mysqld/mysqld.sock
Uptime:         42 min 49 sec

Threads: 1  Questions: 372  Slow queries: 0  Opens: 166  Flush tables: 1  Open tables: 30  Queries per second avg: 0.144

Отже, я шукаю графік стовпців у кожній таблиці

show create table company;

Виявляється, колонна колонка - латинська. Тому я не можу вставити китайську мову в базу даних.

 ALTER TABLE company CONVERT TO CHARACTER SET utf8;

Це може вам допомогти. :)


7

У мене в проекті рейок була така ж проблема:

Incorrect string value: '\xF0\xA9\xB8\xBDs ...' for column 'subject' at row1

Рішення 1: перед збереженням в db перетворити рядок в base64 шляхом Base64.encode64(subject) і після отримання з db використанняBase64.decode64(subject)

Рішення 2:

Крок 1: Змініть набір символів (та порівняння) для стовпчика теми на

ALTER TABLE t1 MODIFY
subject VARCHAR(255)
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

Крок 2: У використанні database.yml

encoding :utf8mb4

4

просто робити

ALTER TABLE `some_table` 
CHARACTER SET = utf8 , COLLATE = utf8_general_ci ;

ALTER TABLE `some_table` 
CHANGE COLUMN `description_with_latin_or_something` `description` TEXT CHARACTER SET 'utf8' NOT NULL ;

що робити, якщо у мене є маса таблиць, які я хочу змінити в базі даних? а що робити, якщо всі мають різні механізми зберігання даних (innodb тощо)?
Янніс Дран

4

Припустимо, що ви використовуєте phpmyadmin для вирішення цієї помилки, виконайте наступні дії:

  1. phpMyAdmin
  2. your_table
  3. "Вкладка структури"
  4. змінити Збір поля з latin1_swedish_ci(або що б там не було) наutf8_general_ci

5
Неправильно, ви вважаєте, що він використовує phpMyAdmin.
ШаГ

не працює ...... і порівняння змінюється на "операцію", а не на структуру
Olorunfemi Ajibulu

@OlorunfemiAjibulu так, ви можете також змінити його в "структурі". Для деяких людей тут це спрацювало
Тео Михайла

@TeoMihaila Можливо, це версія.
Olorunfemi Ajibulu

3

Його здебільшого викликано деякими символами unicode. У моєму випадку це був символ валюти рупія.

Щоб швидко виправити це, мені довелося помітити персонажа, що викликав цю помилку. Я копію вставив весь текст у текстовий редактор типу vi і замінив тривожний символ текстовим.


3
В ОП згадувалося, що тисяча записів вставляється ....
Геллі Енн

3

У мене була ця проблема з моїм додатком PLAY Java. Це мій слід стека для цього винятку:

javax.persistence.PersistenceException: Error[Incorrect string value: '\xE0\xA6\xAC\xE0\xA6\xBE...' for column 'product_name' at row 1]
  at io.ebean.config.dbplatform.SqlCodeTranslator.translate(SqlCodeTranslator.java:52)
  at io.ebean.config.dbplatform.DatabasePlatform.translate(DatabasePlatform.java:192)
  at io.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:83)
  at io.ebeaninternal.server.persist.dml.DmlBeanPersister.insert(DmlBeanPersister.java:49)
  at io.ebeaninternal.server.core.PersistRequestBean.executeInsert(PersistRequestBean.java:1136)
  at io.ebeaninternal.server.core.PersistRequestBean.executeNow(PersistRequestBean.java:723)
  at io.ebeaninternal.server.core.PersistRequestBean.executeNoBatch(PersistRequestBean.java:778)
  at io.ebeaninternal.server.core.PersistRequestBean.executeOrQueue(PersistRequestBean.java:769)
  at io.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:456)
  at io.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:406)
  at io.ebeaninternal.server.persist.DefaultPersister.save(DefaultPersister.java:393)
  at io.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1602)
  at io.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1594)
  at io.ebean.Model.save(Model.java:190)
  at models.Product.create(Product.java:147)
  at controllers.PushData.xlsupload(PushData.java:67)
  at router.Routes$$anonfun$routes$1.$anonfun$applyOrElse$40(Routes.scala:690)
  at play.core.routing.HandlerInvokerFactory$$anon$3.resultCall(HandlerInvoker.scala:134)
  at play.core.routing.HandlerInvokerFactory$$anon$3.resultCall(HandlerInvoker.scala:133)
  at play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$8$$anon$2$$anon$1.invocation(HandlerInvoker.scala:108)
  at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:88)
  at play.http.DefaultActionCreator$1.call(DefaultActionCreator.java:31)
  at play.core.j.JavaAction.$anonfun$apply$8(JavaAction.scala:138)
  at scala.concurrent.Future$.$anonfun$apply$1(Future.scala:655)
  at scala.util.Success.$anonfun$map$1(Try.scala:251)
  at scala.util.Success.map(Try.scala:209)
  at scala.concurrent.Future.$anonfun$map$1(Future.scala:289)
  at scala.concurrent.impl.Promise.liftedTree1$1(Promise.scala:29)
  at scala.concurrent.impl.Promise.$anonfun$transform$1(Promise.scala:29)
  at scala.concurrent.impl.CallbackRunnable.run$$$capture(Promise.scala:60)
  at scala.concurrent.impl.CallbackRunnable.run(Promise.scala)
  at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:56)
  at play.api.libs.streams.Execution$trampoline$.execute(Execution.scala:70)
  at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:48)
  at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:68)
  at scala.concurrent.impl.Promise$KeptPromise$Kept.onComplete(Promise.scala:368)
  at scala.concurrent.impl.Promise$KeptPromise$Kept.onComplete$(Promise.scala:367)
  at scala.concurrent.impl.Promise$KeptPromise$Successful.onComplete(Promise.scala:375)
  at scala.concurrent.impl.Promise.transform(Promise.scala:29)
  at scala.concurrent.impl.Promise.transform$(Promise.scala:27)
  at scala.concurrent.impl.Promise$KeptPromise$Successful.transform(Promise.scala:375)
  at scala.concurrent.Future.map(Future.scala:289)
  at scala.concurrent.Future.map$(Future.scala:289)
  at scala.concurrent.impl.Promise$KeptPromise$Successful.map(Promise.scala:375)
  at scala.concurrent.Future$.apply(Future.scala:655)
  at play.core.j.JavaAction.apply(JavaAction.scala:138)
  at play.api.mvc.Action.$anonfun$apply$2(Action.scala:96)
  at scala.concurrent.Future.$anonfun$flatMap$1(Future.scala:304)
  at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:37)
  at scala.concurrent.impl.CallbackRunnable.run$$$capture(Promise.scala:60)
  at scala.concurrent.impl.CallbackRunnable.run(Promise.scala)
  at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
  at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:91)
  at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
  at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:81)
  at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:91)
  at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40)
  at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(ForkJoinExecutorConfigurator.scala:43)
  at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
  at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
  at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
  at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.sql.SQLException: Incorrect string value: '\xE0\xA6\xAC\xE0\xA6\xBE...' for column 'product_name' at row 1
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
  at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
  at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
  at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
  at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
  at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
  at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
  at io.ebeaninternal.server.type.DataBind.executeUpdate(DataBind.java:82)
  at io.ebeaninternal.server.persist.dml.InsertHandler.execute(InsertHandler.java:122)
  at io.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:73)
  ... 59 more

Я намагався зберегти запис за допомогою io.Ebean. Я виправив це, створивши свою базу даних із зіставленням utf8mb4 і застосував еволюцію гри, щоб відновити всі таблиці, щоб усі таблиці були відтворені за допомогою зіставлення utf-8.

CREATE DATABASE inventory CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2

Я хочу застосувати зміну лише до одного поля, ви можете спробувати серіалізувати поле

class MyModel < ActiveRecord::Base
  serialize :content

  attr_accessible :content, :title
end

2

Якщо ви створюєте нову таблицю MySQL, ви можете вказати схему всіх стовпців при створенні, і це вирішило проблему для мене.

CREATE TABLE tablename (
<list-of-columns>
)
CHARSET SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Ви можете прочитати детальніше: https://dev.mysql.com/doc/refman/8.0/en/charset-column.html


2

це не рекомендаційне рішення .. Але варто поділитися. Оскільки мій проект є оновленням СУБД із старого Mysql до найновішого (8). Але я не можу змінити структуру таблиці, тільки конфігурацію СУБД (mysql). Рішення для сервера mysql.

тест на Windows mysql 8.0.15 для пошуку конфігурації mysql

sql-mode = "....."

коментуй це. Або в моєму випадку просто введіть / додайте

sql-mode = "NO_ENGINE_SUBSTITUTION"

чому не рекомендується рішення. тому що якщо ви використовуєте latin1 (мій випадок) .. дані вставляються успішно, але не вміст (mysql не відповідає з помилкою !!). наприклад, ви вводите подібну інформацію

бла \ х12

це економить

бла [] (коробка)

добре .. для моєї проблеми .. я можу змінити поле на UTF8 .. Але є невелика проблема .. див. вище відповідь про інше рішення не вдається, тому що слово не вставлено, оскільки містить більше 2 байтів (cmiiw) .. це рішення зробіть ваші вставні дані перехідними. Доцільним є використання blob .., і ви можете пропустити мою відповідь.

Ще одне тестування, пов’язане з цим, було .. використання utf8_encode у коді перед збереженням. Я використовую на latin1, і це був успіх (я не використовую sql-режим )! такий же, як і вище, використовуючи base64_encode .

Моя пропозиція проаналізувати вашу табличну потребу та спробувала перейти з іншого формату на UTF8


У своєму settings.py (проект Django) я змінив на sql-mode = "NO_ENGINE_SUBSTITUTION". Це працює.
Taciano Morais Silva


1

Вам потрібно встановити utf8mb4 в мета html, а також у вашому сервері alter tabel та встановити зіставлення у utf8mb4


1

Підказка: На AWS RDS вам потрібна нова група параметрів для вашої БД MySQL з параметрами (замість редагування my.cnf)

  • collation_connection: utf8mb4_unicode_ci
  • collation_database: utf8mb4_unicode_ci
  • collation_server: utf8mb4_unicode_ci
  • character_set_client: utf8mb4
  • character_set_connection: utf8mb4
  • символ_set_database: utf8mb4
  • character_set_resulta: utf8mb4
  • character_set_server: utf8mb4

Примітка: символ_set_system залишається "utf8"

Ці команди SQL НЕ РОБОТИ ПОСТІЙНО - лише на сеансі:

set character_set_server = utf8mb4;
set collation_server = utf8mb4_unicode_ci;

0

Мені також довелося скинути і заново створити всі збережені процедури бази даних (і також функції), щоб вони виконувались у новому наборі символів utf8mb4.

Виконати:

SHOW PROCEDURE STATUS;

…, Щоб побачити, які процедури не оновлювались до нових значень____бліку, символу_сполучення_зв’язку та співвідношення баз даних сервера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.