জেডিবিসির মাধ্যমে মাইএসকিউএলে ইউটিএফ -8 ?োকানোর চেষ্টা করার সময় "ভুল স্ট্রিংয়ের মান"?


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_ জেনারাল_সি।

কি সমস্যা হতে পারে?


এটি লাতিন ছোট লেটার এন টিলেড (ñ) এর সাথে হবে।
andreszs

অন্যদের জন্য এই সমস্যাটির মুখোমুখি হওয়ার জন্য, আপনি চেষ্টা করতে পারেন: ডাটাবেজে: ALTER DATABASE ডাটাবেস_নাম CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - এটি তৈরি করা টেবিলগুলি "এখন থেকে" সমাধান করবে। বিদ্যমান টেবিলের জন্য নয়। তাদের জন্য আপনাকে যা করতে হবে: টেবিলের টেবিলের নাম অক্ষরে অক্ষরে সেট করুন utf8mb4 কল করুন utf8mb4_unicode_ci; উত্স -
ডিজিটালওশন.com

উত্তর:


321

মাইএসকিউএলের utf8কেবলমাত্র ইউনিকোড অক্ষরকেই অনুমতি দেয় যা ইউটিএফ -8-তে 3 বাইটের সাথে প্রতিনিধিত্ব করা যায়। এখানে আপনার একটি অক্ষর রয়েছে যার জন্য 4 বাইট দরকার: \ xF0 \ x90 \ x8D \ x83 ( U + 10343 গথিক লেটার সাউইল )।

আপনি মাইএসকিউএল 5.5 বা যদি তোমার সাথে পরে কলাম থেকে এনকোডিং পরিবর্তন করতে পারেন utf8থেকে utf8mb4। এই এনকোডিংটি ইউটিএফ -8-তে 4 বাইট দখল করে এমন অক্ষরগুলির সঞ্চয় করার অনুমতি দেয়।

এছাড়াও আপনি সার্ভার সম্পত্তি সেট করতে হতে পারে character_set_serverজন্য utf8mb4মাইএসকিউএল কনফিগারেশন ফাইল হবে। দেখে মনে হচ্ছে সংযোগকারী / জে অন্যথায় 3-বাইট ইউনিকোডের ডিফল্ট হয়েছে :

উদাহরণস্বরূপ, সংযোগকারী / জেতে 4-বাইট ইউটিএফ -8 অক্ষর সেটগুলি ব্যবহার করতে, মাইএসকিউএল সার্ভারটি কনফিগার করুন character_set_server=utf8mb4এবং characterEncodingসংযোগকারী / জে সংযোগের স্ট্রিংটি ছেড়ে যান। সংযোগকারী / জে তারপরে ইউটিএফ -8 সেটিংসটি স্বয়ংক্রিয়ভাবে সনাক্ত করবে।


151
ইউটিএফ 8 করার পক্ষে কী এক অদ্ভুত পছন্দটির অর্থ "ইউটিএফ 8 এর উপসেট যা 3 বাইটে উপস্থাপন করা যায়" mean
এরিক জে।

4
character_encoding_serverনোটা বৈধ মাইএসকিউএল কনফিগারেশন ভেরিয়েবলের নাম। আমি পরিবর্তে পৃথক কলামগুলি ছাড়াও সেট character_set_serverকরার চেষ্টা করেছি utf8mb4, তবে এটি কিছুই পরিবর্তন করেনি।
রোমেন পলাস

20
# প্রতিটি ডাটাবেসের জন্য: ALTER DATABASE ডাটাবেস_নাম অক্ষর সেট = utf8mb4 কলেজ = utf8mb4_unicode_ci; # প্রতিটি টেবিলের জন্য: টেবিলের টেবিল_নাম অক্ষর অক্ষরে অক্ষরে সেট করুন utf8mb4 ক্লিক করুন utf8mb4_unicode_ci; # প্রতিটি কলামের জন্য: টেবিলের টেবিলের_নাম পরিবর্তন করুন কলাম_নাম কলাম_নাম মার্চারচ (191) চরিত্রটি সেট করুন utf8mb4 কল করুন utf8mb4_unicode_ci;
আইকিং

14
উদ্ভট যে UTF-8 এটি UTF-8 হিসাবে আপডেট না হওয়া অবধি UTF-8 নয়
ক্লোরস

3
সুতরাং আপনি পরামর্শ দিচ্ছেন যে ইউটিএফ -8 3 (তিন) বাইট সহ ল্যাটিন ছোট লেটার এন টিল্ড (ñ) এর সাথে সঞ্চয় করতে অক্ষম, এবং আমাদের "এস্পা" সঠিকভাবে বানান করার জন্য আমাদের 4 (চার) বাইট দরকার? সত্যি? এর চেয়ে বেশি অসুবিধে হতে পারে? আমরা তখন 3 বাইট সহ এজেড এবং 0-9 এর পাশাপাশি কী সঞ্চয় করতে পারি ..
andreszs

94

স্ট্রিংগুলি হ'ল\xF0 কেবলমাত্র ইউটিএফ -8 ব্যবহার করে একাধিক বাইট হিসাবে অক্ষরগুলি এনকোড করা থাকে ।

যদিও আপনার জঙ্গিটি utf8_general_ci এ সেট করা আছে, আমি সন্দেহ করি যে ডাটাবেস, টেবিল বা এমনকি কলামের অক্ষর এনকোডিং আলাদা হতে পারে। তারা স্বাধীন সেটিংস । চেষ্টা করুন:

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

আপনার প্রকৃত ডেটা টাইপটি ভ্রচার (255) এর জন্য যা-ই হোক না কেন প্রতিস্থাপন করুন


4
আসলে চেষ্টা করেছিলাম, কাজ হয়নি। কলামের ডেটা প্রকারটি LONGTEXT বিটিডব্লু হয়, যদি এটি বিবেচনা করে।
লাইয়ার

1
আপনার অ্যাপটি জাভাতে আছে আমি কি তা নিই? file-encodingইউটিএফ -8 নির্দিষ্ট করে প্যারামিটারের সাহায্যে জাভা চাওয়ার চেষ্টা করুন , উদাহরণস্বরূপ java -Dfile.encoding=UTF-8বা আপনার টমক্যাট (ইত্যাদি) কনফিগার ফাইলে একটি উপযুক্ত সুইচ যুক্ত করুন।
এরিক জে

1
আমি আপনাকে জোর দেওয়ার পরামর্শ দিই "ডাটাবেসের অক্ষর এনকোডিং, সারণী বা এমনকি কলামটি আলাদা হতে পারে" । এটি সবচেয়ে গুরুত্বপূর্ণ জিনিস।
জেলি অ্যান

আপনাকে ছকটি সেপ্টের সাথে utt8 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

জেডিবিসি-র জন্য দুটি সমাধান রয়েছে:

সমাধান 1 (মাইএসকিউএল পুনরায় চালু করার প্রয়োজন):

  1. my.cnfনিম্নলিখিতগুলির মতো সংশোধন করুন এবং মাইএসকিউএল পুনরায় চালু করুন:

    [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. মাইএসকিউএল পুনরায় চালু করুন

  2. টেবিল এবং কলাম এনকোডিং এ পরিবর্তন করুন utf8mb4

  3. স্টপ নির্দিষ্টকরণ characterEncoding=UTF-8এবংcharacterSetResults=UTF-8 JDBC সংযোগকারী এ, কারণ এটিকে ওভাররাইড হবে character_set_client, character_set_connection, character_set_resultsকরতেutf8

দুটি সমাধান (মাইএসকিউএল পুনরায় চালু করার দরকার নেই):

  1. টেবিল এবং কলাম এনকোডিং এ পরিবর্তন করুন utf8mb4

  2. গ্রাফিক্যাল characterEncoding=UTF-8জেডিবিসি সংযোগকারীটিতে করা, জেডিবিসি সংযোগকারীটি সাপোর্ট করে না বলে কারণ utf8mb4

  3. আপনার এসকিউএল স্টেটমেন্টটি এভাবে লিখুন ( allowMultiQueries=trueজেডিবিসি সংযোগকারী যুক্ত করা দরকার ):

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

এই নিশ্চিত সার্ভারে প্রতিটি সংযোগ স্থাপনে করবে character_set_client,character_set_connection,character_set_resultsহয় utf8mb4
আরো দেখুন অক্ষরসেট-সংযোগ


3
পয়েন্ট 3 আমার কাছে ডিবি, টেবিল এবং ক্ষেত্রের এনকোডিংগুলি পরিবর্তনের সাথে একত্রে ক্লিঞ্জার ছিল: 'সেট নামস utf8mb4; মাইটেবলের মধ্যে অন্তর্ভুক্ত করুন ...';
কেবিবুকস

পয়েন্ট 3 আমার জন্যও কৌশলটি করেছে, আমার টেবিলের এনকোডিং ইতিমধ্যে utf8mb4 এ সেট করেছে।
স্যার_ফেনর

সারণী এনকোডিংটি কেবলমাত্র একটি ডিফল্ট। এটি কলামের এনকোডিংটিকে 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

আবার উপরের পরামর্শ থেকে সমস্ত জেডিবিসি সংযোগ ছিল characterEncoding=UTF-8এবংcharacterSetResults=UTF-8 তাদের কাছ থেকে মুছে

এই সেট দিয়ে -Dfile.encoding=UTF-8 নিয়ে কোনও পার্থক্য দেখা গেল।

আমি এখনও উপরের মতো একই ব্যর্থতা পেয়ে ডিবিতে আন্তর্জাতিক পাঠ্য লিখতে পারি নি

এখন এটি কীভাবে রূপান্তর করতে হবে সম্পূর্ণ-মাইএসকিএল-ডাটাবেস-ক্যারেটসেট-এবং-কোলেশন-থেকে-ইউটিএফ -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%')

সমস্ত প্রতিস্থাপন এডিটর কপি পেস্ট আউটপুট সঠিক ডিবিতে সংযুক্ত হওয়ার পরে কোনও কিছুর সাথেই মাইএসকিএল-এ ফিরে আসে না।

এটিই হ'ল কাজটি করতে হয়েছিল এবং সমস্তই আমার পক্ষে কাজ করে বলে মনে হচ্ছে। - 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 কমান্ডটি সমস্ত VitcAR ক্ষেত্রের বিষয়বস্তুকে বৈধ, আসল UTF8 এনকোড স্ট্রিংয়ে রূপান্তর করবে? আমি জিজ্ঞাসা করি কারণ আমার LATIN1 ফিল্ডগুলি ইউটিএফ 8 এ রূপান্তর করতে আমার সমস্যা হচ্ছে, বিশেষত যখন ñ চরিত্রটি পাওয়া যায় তখন কোনও ভুল স্ট্রিং মান (ত্রুটি 1366) এর কারণে রূপান্তর সরাসরি ব্যর্থ হয়।
andreszs

যদি আপনি ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;এই চূড়ান্ত সময়টি দৌড়ানোর সময় অদ্ভুতভাবে যথেষ্ট বোঝেন তবে সমস্ত ক্ষেত্রের আর কোনও অক্ষর সেট সংজ্ঞায়িত হয়নি। সুতরাং উপরের পাসওয়ার্ডটি passwordবর্ণচর্চায় পরিণত হয়েছে (255) নাল নয়, (এনকোডিংয়ের কিছুই নেই)। এর অর্থ হ'ল শেষ কমান্ডটি অবশ্যই টেবিল সংজ্ঞাটি প্রকৃতপক্ষে মাইএসকিএল অনুসন্ধান করেছে এবং কারণ এখন টেবিলটি ডিফল্টরূপে ক্ষেত্রগুলির আর প্রয়োজন নেই - আমি মনে করি তারা কেবল অক্ষর সেট করে রেখেছিলেন কেবল পুরো টেবিল আপডেটের ডাম্পের সময় set এটি এটি আপডেট করতে পারে না এবং তাই এটিকে সেই অবস্থায় ফেলে রাখা হয়েছিল
ভিএইচ

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;

এটি কলামের চরসেটটি লাতিন out এই কারণেই, আমি ডেটাবেসে চীনা প্রবেশ করতে পারি না।

 ALTER TABLE company CONVERT TO CHARACTER SET utf8;

এটি আপনাকে সাহায্য করতে পারে। :)


7

আমার রেল প্রকল্পে আমার একই সমস্যা ছিল:

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

সমাধান 1: ডিবিতে সংরক্ষণের আগে স্ট্রিংটিকে বেস 64 এ রূপান্তর করুন Base64.encode64(subject) পরে এবং ডিবি ব্যবহার থেকে আনার পরেBase64.decode64(subject)

সমাধান 2:

পদক্ষেপ 1: সাবজেক্ট কলামের জন্য অক্ষর সেট (এবং কোলেশন) দ্বারা পরিবর্তন করুন

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

পদক্ষেপ 2: ডাটাবেস.আইএমএল ব্যবহারে

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 ;

আমার কাছে যদি গুচ্ছ টেবিল থাকে তবে আমি ডাটাবেসে পরিবর্তন করতে চাই? এবং যদি সবার স্টোরেজ ইঞ্জিন (ইনোডাব ইত্যাদি) থাকে তবে কী হবে?
ইয়ানিস ড্রান

4

ধরে নিই যে আপনি এই ত্রুটিটি সমাধান করতে phpmyadmin ব্যবহার করছেন , এই পদক্ষেপগুলি অনুসরণ করুন:

  1. পিএইচপি মাই এডমিন
  2. your_table
  3. "কাঠামো ট্যাব"
  4. আপনার ক্ষেত্রের কোলেশন latin1_swedish_ci(বা তা যাই হোক না কেন) থেকে পরিবর্তন করুনutf8_general_ci

5
বৈধ নয়, আপনি ধরে নিচ্ছেন তিনি phpMyAdmin ব্যবহার করেন।
শাহ 06

কাজ করে না ...... এবং
কোলেশনটি 'অপারেশন'-

@ ওলরুনফেমি আজীবুলু হ্যাঁ, আপনি এটিকে "কাঠামো" তেও পরিবর্তন করতে পারবেন। এখানকার কিছু লোকের জন্য, এটি কাজ করেছিল
তেও মিহাইলা

@ টিওমিহাইলা সম্ভবত, এটির সংস্করণ রয়েছে।
ওলোরুনফেমি আজিবুলু

3

এটি বেশিরভাগ কিছু ইউনিকোড চরিত্রের কারণে ঘটেছিল। আমার ক্ষেত্রে এটি ছিল রুপি মুদ্রার প্রতীক।

এটি দ্রুত সমাধানের জন্য, আমাকে এই ত্রুটির কারণ হিসাবে চিহ্নিত চরিত্রটি চিহ্নিত করতে হয়েছিল। আমি vi এর মতো কোনও পাঠ্য সম্পাদকে পুরো পাঠ্যটি অনুলিপি করেছিলাম এবং ঝামেলার চরিত্রটিকে একটি পাঠ্যের সাথে প্রতিস্থাপন করেছি।



3

আমার প্লে জাভা অ্যাপ্লিকেশনটিতে আমার এই সমস্যা ছিল। এটি ব্যতিক্রমের জন্য এটি আমার স্ট্যাক ট্রেস:

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

আমি আইও.ইবিন ব্যবহার করে একটি রেকর্ড সংরক্ষণ করার চেষ্টা করছিলাম। আমি এটি ইউটিএফ 8 এমবি 4 কোলেশন দিয়ে আমার ডাটাবেস তৈরি করে ঠিক করেছি এবং সমস্ত টেবিল তৈরি করতে পুনরায় খেলার বিবর্তন প্রয়োগ করেছি যাতে সমস্ত টেবিলগুলি 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

যদি আপনি একটি নতুন মাইএসকিউএল টেবিল তৈরি করে থাকেন তবে আপনি তৈরি করার পরে সমস্ত কলামের চরসেটটি নির্দিষ্ট করতে পারেন এবং এটি আমার জন্য সমস্যাটি স্থির করেছে।

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

এটি সুপারিশ সমাধান নয় .. তবে ভাগ করে নেওয়া উচিত। যেহেতু আমার প্রকল্পটি ডিবিএমএসকে পুরানো মাইএসকিএল থেকে নতুন (8) এ আপগ্রেড করছে। তবে আমি টেবিলের কাঠামো পরিবর্তন করতে পারি না, কেবলমাত্র ডিবিএমএস কনফিগারেশন (মাইএসকিএল)। মাইএসকিএল সার্ভারের সমাধান।

উপর পরীক্ষা উইন্ডোজ মাইএসকিউএল 8.0.15 মাইএসকিউএল উপর কনফিগ জন্য অনুসন্ধান

SQL-মোড = "....."

এটি uncomment। অথবা আমার ক্ষেত্রে কেবল টাইপ / অ্যাড করুন

SQL-মোড = "NO_ENGINE_SUBSTITUTION"

কেন প্রস্তাবিত সমাধান না। কারণ আপনি যদি ল্যাটিন 1 ব্যবহার করেন (আমার ক্ষেত্রে) .. ডেটা সফলভাবে sertোকানো হয় তবে সামগ্রীটি নয় (মাইএসকিএল ত্রুটির সাথে প্রতিক্রিয়া দেয় না)) উদাহরণস্বরূপ আপনি এই জাতীয় তথ্য টাইপ করুন

bla \ x12

এটি সংরক্ষণ

ব্লে [] (বাক্স)

ঠিক আছে .. আমার সমস্যার জন্য .. আমি ক্ষেত্রটি ইউটিএফ 8 এ পরিবর্তন করতে পারি .. তবে ছোট সমস্যা আছে .. অন্যান্য সমাধান সম্পর্কে উপরের উত্তরটি ব্যর্থ হয়েছে কারণ শব্দটি sertedোকানো হয়নি কারণ 2 বাইটের বেশি (সিএমআইইউ) রয়েছে এটি সমাধান আপনার সন্নিবেশ ডেটা বাক্সে পরিণত করুন। যুক্তিসঙ্গত হ'ল ব্লব ব্যবহার করা .. এবং আপনি আমার উত্তরটি এড়িয়ে যেতে পারেন।

এটি সম্পর্কিত আরও একটি পরীক্ষা ছিল .. সংরক্ষণের আগে আপনার কোডে utf8_encode ব্যবহার করা । আমি লাতিন 1 এ ব্যবহার করেছি এবং এটি সাফল্য ছিল (আমি স্ক্যালি-মোড ব্যবহার করছি না )! উপরের উত্তর হিসাবে একই 6464_encode ব্যবহার করুন

আমার পরামর্শটি আপনার টেবিলের প্রয়োজনীয়তা বিশ্লেষণ করে এবং অন্যান্য ফর্ম্যাট থেকে ইউটিএফ 8 এ পরিবর্তনের চেষ্টা করেছিল


আমার সেটিংস.পিতে (জ্যাঙ্গো প্রজেক্ট), আমি স্কেল-মোডে = "NO_ENGINE_SUBSTITUTION" এ পরিবর্তিত হয়েছি। ইহা কাজ করছে.
টাসিয়ানো মোরেইস সিলভা


1

আপনাকে মেটা এইচটিএমএল এ utf8mb4 সেট করতে হবে এবং আপনার সার্ভারে টবেল পরিবর্তন করতে হবে এবং কোলেশনটি utf8mb4 এ সেট করতে হবে


1

ইঙ্গিত: এডাব্লুএস আরডিএসে আপনার মাইএসকিউএল ডিবির জন্য প্যারামগুলি সহ একটি নতুন প্যারামিটার গ্রুপ প্রয়োজন (একটি my.cnf সম্পাদনার পরিবর্তে)

  • কোলেশন_সংযোগ: utf8mb4_unicode_ci
  • কোলেশন_ডেটবেস: utf8mb4_unicode_ci
  • কোলেশন_সার্ভার: utf8mb4_unicode_ci
  • ক্যারেক্টার_সেট_ক্লিয়েন্ট: utf8mb4
  • অক্ষর_সেট_সংযোগ: utf8mb4
  • অক্ষর_সেট_ডেটাবেস: utf8mb4
  • চরিত্র_সেট_সাল্টস: utf8mb4
  • অক্ষর_সেট_সার্ভার: utf8mb4

দ্রষ্টব্য: অক্ষর_সেট_সিস্টেমটি "utf8" থেকে যায়

এই এসকিউএল কমান্ড না না স্থায়ীভাবে কাজ - শুধুমাত্র একটি সেশনে:

set character_set_server = utf8mb4;
set collation_server = utf8mb4_unicode_ci;

0

আমাকে ইউটিএফ -8 এমবি 4-র নতুন অক্ষরের মধ্যে কার্যকর করার জন্য আমাকে ডাটাবেসের সমস্ত সঞ্চিত পদ্ধতি (এবং ফাংশনগুলিও) ফেলে এবং পুনরায় তৈরি করতে হয়েছিল।

চালান:

SHOW PROCEDURE STATUS;

… কোন পদ্ধতিটি সার্ভারের নতুন অক্ষর_সেট_সামগ্রী, কোলেশন_সংযোগ এবং ডেটাবেস কোলেশন মানগুলিতে আপডেট হয়নি তা দেখতে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.