«Неверное строковое значение» при попытке вставить 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.

В чем может быть проблема?

Лиор
источник
Это было бы ЛАТИНСКОЕ МАЛЕНЬКОЕ ПИСЬМО N С ТИЛЬДОМ (-).
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 GOTHIC LETTER SAUIL ).

Если у вас 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.

Joni
источник
151
Какой странный выбор иметь utf8 действительно означает «подмножество UTF8, которое может быть представлено в 3 байта».
Эрик Дж.
4
character_encoding_serverне является допустимым именем переменной конфигурации MySQL. Я попытался установить , character_set_serverчтобы utf8mb4вместо этого, в дополнение к отдельным колонкам, но это ничего не изменило.
Ромен Паулюс
20
# Для каждой базы данных: ALTER DATABASE имя_базы_данных CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; # Для каждой таблицы: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # Для каждого столбца: ALTER TABLE table_name CHANGE имя_ столбца column_name VARCHAR (191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ИНК
14
Странно, что UTF-8 не является UTF-8, пока не обновится до UTF-8
Klors
3
Таким образом, вы предполагаете, что UTF-8 с 3 (тремя) байтами не может хранить LATIN SMALL LETTER N WITH 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 между прочим, если это имеет значение.
Лиор
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
Шобхит Шарма
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 statment, как это (нужно добавить allowMultiQueries=trueв JDBC коннектор):

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

это будет убедиться , что каждое соединение с сервером, character_set_client,character_set_connection,character_set_resultsявляются utf8mb4.
Также см. Charset-соединение .

madtracy
источник
3
Точка 3 стала для меня решающим фактором в связи с изменением кодировки БД, таблиц и полей: '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похоже, не имеет значения.

Я все еще не мог написать международный текст в БД, получая ту же ошибку, что и выше

Теперь, используя это как конвертировать весь mysql-database-characterset-and-collation-to-utf-8

Обновите всю свою базу данных для использования 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 при подключении к правильной БД.

Это все, что нужно было сделать, и, похоже, все работает для меня. Не - 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

Итак, я смотрю столбец charset в каждой таблице

show create table company;

Оказывается, столбец charset является латинским. Вот почему я не могу вставить китайский в базу данных.

 ALTER TABLE company CONVERT TO CHARACTER SET utf8;

Это может помочь вам. :)

crazy_phage
источник
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 ;
Shareef
источник
что если у меня есть несколько таблиц, которые я хочу изменить в базе данных? а что если у всех разные механизмы хранения (innodb и тд)?
Яннис Дран
4

Предполагая, что вы используете phpmyadmin для решения этой ошибки, выполните следующие действия:

  1. PhpMyAdmin
  2. your_table
  3. «Вкладка структуры»
  4. изменить параметры сортировки вашего поля latin1_swedish_ci(или как оно там) наutf8_general_ci
Тео Михайла
источник
5
Неверно, вы полагаете, что он использует phpMyAdmin.
Шах
не работает ...... и сортировка изменяется в «операции», а не в структуре
Олорунфеми Аджибулу
@OlorunfemiAjibulu да, вы также можете изменить его в "структуре". Для некоторых здесь это сработало
Тео Михайла
@TeoMihaila Возможно, это версия.
Олорунфеми Аджибулу
3

В основном это связано с некоторыми символами Юникода. В моем случае это был символ валюты рупии.

Чтобы быстро это исправить, я должен был определить персонажа, вызывающего эту ошибку. Я скопировал, вставил весь текст в текстовый редактор, такой как 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

amucunguzi
источник
2

это не рекомендательное решение. Но стоит поделиться. Так как мой проект - это обновление СУБД от старого Mysql до новейшего (8). Но я не могу изменить структуру таблицы, только конфиг СУБД (mysql). Решение для сервера MySQL.

тест на Windows MySQL 8.0.15 на MySQL конфигурации поиска

SQL-режим = "....."

раскомментируйте это. Или в моем случае просто введите / добавить

SQL-режим = "NO_ENGINE_SUBSTITUTION"

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

бла \ х12

это сохранить

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

хорошо .. для моей проблемы .. я могу изменить поле на UTF8 .. Но есть небольшая проблема .. см. выше, ответ о другом решении не удался, потому что слово не вставлено, потому что содержит больше чем 2 байта (cmiiw) .. это Решение сделать ваши данные вставки в поле. Разумно использовать blob .. и вы можете пропустить мой ответ.

Еще одно тестирование было связано с использованием utf8_encode в вашем коде перед сохранением. Я использую на latin1, и это был успех (я не использую sql-mode )! ответ выше, используя base64_encode .

Я предложил анализировать ваши требования к таблице и пытался перейти с другого формата на UTF8

user2905554
источник
В моем файле settings.py (проект Django) я изменил на sql-mode = "NO_ENGINE_SUBSTITUTION". Это работает.
Taciano Morais Silva
1

мое решение - изменить тип столбца с varchar (255) на blob

чжуочень шэнь
источник
1

Вам нужно установить utf8mb4 в мета-html, а также на вашем сервере изменить таблицу и установить параметры сортировки в 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
  • символ_связи: utf8mb4
  • база_символов: utf8mb4
  • character_set_results: utf8mb4
  • character_set_server: utf8mb4

Примечание: символьная_система остается "utf8"

Эти команды SQL НЕ РАБОТАЮТ ПОСТОЯННО - только в сеансе:

set character_set_server = utf8mb4;
set collation_server = utf8mb4_unicode_ci;
electrobabe
источник
0

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

Бегать:

SHOW PROCEDURE STATUS;

… Чтобы увидеть, какие процедуры не были обновлены до новых значений сервера character_set_client, collation_connection и Database Collation.

Этан Аллен
источник