"ভুল স্ট্রিং মান" ত্রুটি কিভাবে ঠিক করবেন?


162

ভুল স্ট্রিং মান ত্রুটির কারণে কোনও অ্যাপ্লিকেশনটি এলোমেলো ইমেলগুলি বাতিল করার ঝুঁকির পরে, আমি গিয়েছিলাম এবং utf8কলামের চারসেট এবং ডিফল্ট কলামটি ( utf8_general_ci) ব্যবহার করতে অনেক পাঠ্য কলামগুলি স্যুইচ করেছি যাতে এটি সেগুলি গ্রহণ করে। এটি বেশিরভাগ ত্রুটিগুলি স্থির করে দিয়েছিল এবং অ্যাপ্লিকেশনটি এসএসএল ত্রুটি পাওয়া বন্ধ করে দিয়েছে যখন এটি লাতিন অ ইমেলগুলিকেও আঘাত করে hit

এটি সত্ত্বেও, কিছু ইমেল এখনও প্রোগ্রামটিকে ভুল স্ট্রিং মান ত্রুটিগুলিতে আঘাত করে: (Incorrect string value: '\xE4\xC5\xCC\xC9\xD3\xD8...' for column 'contents' at row 1)

বিষয়বস্তু কলামটি একটি MEDIUMTEXTডেটাটাইব যা কলামের চরসেট এবং utf8কলামের সমষ্টি ব্যবহার করে utf8_general_ci। এই কলামে আমি যে পতাকাটি টগল করতে পারছি সেগুলি নেই।

মনে রাখবেন যে আমি একেবারে প্রয়োজনীয় না হলে অ্যাপ্লিকেশন উত্স কোডটি স্পর্শ করতে বা এমনকি দেখতে চাই না:

  • কী কারণে এই ত্রুটি ঘটছে? (হ্যাঁ, আমি জানি ইমেলগুলি এলোমেলো আবর্জনায় পূর্ণ, তবে আমি ভেবেছিলাম যে utf8 বেশ অনুমোদিত হবে)
  • আমি কীভাবে এটি ঠিক করতে পারি?
  • এই ধরনের সংশোধন করার সম্ভাব্য প্রভাবগুলি কী কী?

আমি যে বিষয়টিকে বিবেচনা করেছি তা বাইনারি পতাকা চালু করে একটি utf8 ভারচার ([কিছু সংখ্যক]] এ স্যুইচ করা ছিল, তবে আমি মাইএসকিউএল এর সাথে বরং অপরিচিত, এবং যদি এইরকম কোনও স্থির করে তোলে তবে কোনও ধারণা নেই।


3
ময়নাতদন্ত: রিচিহিন্ডেলের সমাধান সমস্যার সমাধান করেছে এবং এটি চলার সময় কোনও অতিরিক্ত সমস্যার পরিচয় দেয়নি। এটি কিছুটা হ্যাক হতে পারে তবে এটি কার্যকর হয়েছে এবং তৃতীয় পক্ষের সফ্টওয়্যার যা আমি পুরোপুরি বুঝতে পারি না তা দিয়ে আমার হাত নোংরা হওয়া এড়াতে দিয়েছিল। এই মুহুর্তে, আমরা সফ্টওয়্যার / স্কিমাটির একটি নতুন সংস্করণে আপডেট করেছি যা এই সমস্ত এনকোডিংয়ের সমস্যাগুলি সঠিকভাবে পরিচালনা করে (এবং এটি যথেষ্ট নতুন যা এটি সমর্থিত) হ্যাকটিকে অযৌক্তিকভাবে উপস্থাপন করে।
ব্রায়ান

উত্তর:


43

"\xE4\xC5\xCC\xC9\xD3\xD8"বৈধ UTF-8 নয়। পাইথন ব্যবহার করে পরীক্ষিত:

>>> "\xE4\xC5\xCC\xC9\xD3\xD8".decode("utf-8")
...
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-2: invalid data

আপনি যদি ডাটাবেসের মধ্যে ডিকোডিংয়ের ত্রুটিগুলি এড়ানোর জন্য কোনও উপায় সন্ধান করেন, তবে সিপি 1252 এনকোডিং (ওরফে "উইন্ডোজ -1222" ওরফে "উইন্ডোজ ওয়েস্টার্ন ইউরোপীয়") হল সর্বাধিক অনুমতিযুক্ত এনকোডিং - প্রতিটি বাইট মান একটি বৈধ কোড পয়েন্ট।

অবশ্যই এটি আর জেনুইন ইউটিএফ -8, বা অন্য কোনও সিপি 1252 এনকোডিং বুঝতে পারবে না, তবে মনে হচ্ছে আপনি এ সম্পর্কে খুব উদ্বিগ্ন নন?


4
"আপনি অবশ্যই প্রকৃত ইউটিএফ -8 বুঝতে পারবেন না এর অর্থ কী?"
ব্রায়ান

5
@ ব্রায়ান: আপনি যদি বলেন যে আপনি এটিকে সিপি 1252 দিচ্ছেন, এবং আপনি আসলে এটির জন্য ইউটিএফ -8 দিচ্ছেন, বলুন café, এটি এরূপ ব্যাখ্যা করতে চলেছে café। এটি ক্রাশ হবে না, তবে এটি উচ্চ-বিট চরিত্রগুলিকে ভুল বুঝবে।
রিচিহিন্ডল

3
@ রিচি: ডাটাবেসটি খুশিতে তথ্য যা খুশি কল করতে পারে, তবে পিএইচপি কোড যে এটি ধরবে তা যদি স্ট্রিংয়ের মধ্যে স্টাফ করে রাখে তবে তাতে খুব বেশি পার্থক্য হবে না ...? ইউটিএফ -8 বোঝার অভাবের উপর ঠিক কোথায় প্রভাব ফেলছে তা আমি দেখতে পাচ্ছি না।
ব্রায়ান

7
@ ব্রায়ান: না, আপনি ঠিক বলেছেন। ডাটাবেসের মধ্যে এটির পরিবর্তনের সময়টি হবে, উদাহরণস্বরূপ আপনি যদি আপনার এসকিউএলটিতে একটি অর্ডার ব্যবহার করে থাকেন - বাছাই করা আপনার পক্ষে অ-এসসিআইআই অক্ষরযুক্ত ছিল ky
রিচিহাইন্ডল

11
দয়া করে এই উত্তরটিকে সমাধান হিসাবে চিহ্নিত করুন, একটি ত্রুটি লুকানো কোনও কিছুর সমাধান নয়। আপনার গাড়ি থেকে অতিরিক্ত উত্তাপের বাতিটি সরান এবং আপনি দেখতে পাবেন।
ডেভিড ভার্টানিয়ান

133

আমি রিচিগুলির উত্তরটি প্রস্তাব করব না, কারণ আপনি ডাটাবেসের অভ্যন্তরে থাকা ডেটা স্ক্রু করছেন। আপনি আপনার সমস্যার সমাধান করবেন না তবে এটি "আড়াল" করার চেষ্টা করবেন এবং ক্র্যাড হওয়া ডেটা দিয়ে প্রয়োজনীয় ডাটাবেস ক্রিয়াকলাপ সম্পাদন করতে সক্ষম হবেন না।

যদি আপনি এই ত্রুটির মুখোমুখি হন তবে আপনি যে ডেটা প্রেরণ করছেন তা ইউটিএফ -8 এনকোডড নয়, বা আপনার সংযোগটি ইউটিএফ -8 নয়। প্রথমে যাচাই করুন যে ডেটা উত্সটি (একটি ফাইল, ...) সত্যই ইউটিএফ -8।

তারপরে, আপনার ডাটাবেস সংযোগটি পরীক্ষা করুন, সংযোগের পরে আপনার এটি করা উচিত:

SET NAMES 'utf8';
SET CHARACTER SET utf8;

এরপরে, যা টেবিলগুলিতে ডেটা সঞ্চয় করা আছে তা utf8 অক্ষর সেট করে আছে তা যাচাই করুন:

SELECT
  `tables`.`TABLE_NAME`,
  `collations`.`character_set_name`
FROM
  `information_schema`.`TABLES` AS `tables`,
  `information_schema`.`COLLATION_CHARACTER_SET_APPLICABILITY` AS `collations`
WHERE
  `tables`.`table_schema` = DATABASE()
  AND `collations`.`collation_name` = `tables`.`table_collation`
;

শেষ, আপনার ডাটাবেস সেটিংস পরীক্ষা করুন:

mysql> show variables like '%colla%';
mysql> show variables like '%charac%';

যদি উত্স, পরিবহন এবং গন্তব্য UTF-8 হয় তবে আপনার সমস্যাটি চলে গেছে;)


1
@ কারিম: এটি আশ্চর্যের বিষয়, কারণ এই সেটিংটি SET NAMES কমান্ড দ্বারা আচ্ছাদিত, যা SET অক্ষর_সেট_সামগ্রী
নিকো গাওয়েদা

2
দ্বিতীয় কমান্ডটি হওয়া উচিত SET CHARACTER SET utf8(CHARACTER_SET নয়)
কোডার

6
যদিও এই উত্তরগুলি সমস্যাটি তদন্ত করতে সহায়তা করে, এটি ঠিক করার জন্য কী করা উচিত তা উত্তর দেয় না। আমি "utf-8" এর পরিবর্তে "ল্যাটিন 1" দেখছি।
ভানুয়ান

2
এই উত্তরটি সমস্যার ব্যাখ্যায় দুর্দান্ত তবে সমাধানটি বিশদ দেওয়ার ক্ষেত্রে খুব কম (যা ওপি বলেছিল)। @nicogawenda: সমস্যাটি সম্পূর্ণরূপে সমাধানের জন্য সমস্ত এসকিউএল কোয়েরিগুলি চালিত হতে হবে? সমস্ত পূর্ব বিদ্যমান ডেটা কিভাবে ঠিক করবেন?
ক্লিন্ট ইস্টউড

1
"সোর্স, পরিবহন এবং গন্তব্য হল UTF-8 হন, আপনার সমস্যা সর্বস্বান্ত হয়;)" আমার জন্য কৌতুক ছিল
suarsenegger

80

মাইএসকিউএল এর ইউটিএফ -8 প্রকারগুলি যথাযথ ইউটিএফ -8 নয় - এটি কেবল অক্ষর অনুসারে তিনটি বাইট ব্যবহার করে এবং কেবলমাত্র বেসিক বহুভাষিক সমতলকে সমর্থন করে (যেমন কোনও ইমোজি, কোনও জ্যোতির্বিজ্ঞান নয়, ইত্যাদি)।

আপনার যদি উচ্চতর ইউনিকোড প্লেনগুলি থেকে মানগুলি সঞ্চয় করতে হয় তবে আপনাকে utf8mb4 এনকোডিংগুলি দরকার ।


9
আমি মনে করি এটি সম্ভবত সেরা সমাধান। 5.5 এ আপগ্রেড করুন এবং উপরের উত্তরগুলিতে utf8mb4 দিয়ে utf8 প্রতিস্থাপন করুন। আমি টুইটার থেকে utf8 ডেটা সন্নিবেশ করছিলাম যার ইমোজি বা অন্যান্য অক্ষর ছিল যা 4 বাইটের প্রয়োজন needed
rmarscher

ধরে নেওয়া যাক আমরা 5.5 তে আপগ্রেড করব না। আমরা কীভাবে ত্রুটিগুলি দমন করব?
ব্যবহারকারী

আমি এই সর্বাধিক দরকারী উত্তরের জন্য খুব দূরে স্ক্রোল করেছি
হ্যান্ডহেल्डবেলার

1
আসল প্রশ্ন থেকে 10 বছর। এটি জানা যাক যে মাইএসকিউএল এর ইউটিএফ 8 এনকোডিং সঠিক ইউটিএফ 8 নয়। Utf8mb4 ব্যবহার করুন! একই মারিয়াডিবিতে যায়। অন্যথায় আপনার আনন্দের অশ্রু থাকতে পারে না Li
লিয়াম

51

টেবিল এবং ক্ষেত্রগুলির ভুল এনকোডিং রয়েছে; তবে আপনি এগুলিকে ইউটিএফ -8 এ রূপান্তর করতে পারেন।

ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

ALTER TABLE logtest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

ALTER TABLE logtest CHANGE title title VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci;

1
আমি মনে করি এটিই সবার সঠিক উত্তর। আমার কাছে দুটি টেবিলের প্রতিটি ইউটিএফ 8 ভারচার ফর্ম্যাট রয়েছে। এর মধ্যে একটির ত্রুটি পেয়েছে, অন্যটি ঠিক আছে। এমনকি আমি ব্যবহারকারীর 'আপডেট' নির্বাচন করে 'ভাল' utf8 কলাম থেকে অন্য টেবিলের একটি অনুলিপি তৈরি করি, একই ত্রুটি ঘটে। এটি কারণ দুটি সারণী মাইএসকিউএল এর বিভিন্ন সংস্করণে তৈরি করা হয়েছিল।
আইশিগুয়াং

হ্যাঁ! এটি আমার ডাটাবেস টেবিল থেকেও ভুল কনফিগারেশন ছিল। আমি মনে করি এই উত্তরটি সঠিক হওয়া উচিত। আমার সমস্যাটি ছিল যে নির্বাচিত কোলেটটি utf8_ জেনারাল_সি এর পরিবর্তে utf8_unicode_ci ছিল। ধন্যবাদ :)
jprivillaso

2
এই উত্তরটি এখানে কী করছে, শীর্ষে থাকা উচিত
সাগুন শ্রেষ্ঠ

1
এটি আপনাকে সহায়তা করে, যা ভুল হতে পারে তার পরিবর্তে আপনাকে কী চেষ্টা করতে হবে তা বলে।
ভিক্টর ডি

ধন্যবাদ! এটি কেবল আমাকে অনেকটা সহায়তা করেছিল আমি টেবিলের জোটে পিঁপড়াকে বদলে দিয়েছিলাম বলে আমি মনে করেছি যে এটি হওয়া উচিত তবে ক্ষেত্রগুলি এখনও এসকিআই কোলেশন ছিল ...
রাদু

25

আমি আজ এই সমস্যাটি সমাধান করেছি কলামটি 'LONGBLOB' তে পরিবর্তন করে যা UTF-8 অক্ষরের পরিবর্তে কাঁচা বাইট সঞ্চয় করে।

এটি করার একমাত্র অসুবিধা হ'ল আপনাকে নিজের এনকোডিংয়ের যত্ন নিতে হবে। যদি আপনার অ্যাপ্লিকেশনটির কোনও ক্লায়েন্ট ইউটিএফ -8 এনকোডিং এবং অন্যজন সিপি 1252 ব্যবহার করে তবে আপনার ইমেলগুলি ভুল অক্ষর সহ প্রেরণ করতে পারে। এটি এড়াতে আপনার সমস্ত অ্যাপ্লিকেশন জুড়ে সর্বদা একই এনকোডিং (যেমন ইউটিএফ -8) ব্যবহার করুন

টেক্সট / লংটেক্সট এবং বিএলএব / লংব্লব-এর মধ্যে পার্থক্য সম্পর্কে আরও বিশদ জানতে এই পৃষ্ঠাটি দেখুন http://dev.mysql.com/doc/refman/5.0/en/blob.html । এই দুটি নিয়ে ওয়েবে আরও অনেক যুক্তি রয়েছে।


1
এই সমাধানটি যেতে সহজতম উপায় বলে মনে হচ্ছে। আমি সাফল্য ছাড়া অন্য কয়েকটি এনকোডিং চেষ্টা করেছি।
সাইমন আবোলারিনওয়া

10

আপনার ডিফল্ট_চ্যাকার_সেট_নাম utf8 হয় কিনা তা প্রথমে পরীক্ষা করে দেখুন।

SELECT default_character_set_name FROM information_schema.SCHEMATA S WHERE schema_name = "DBNAME";

ফলাফলটি utf8 না হলে আপনাকে অবশ্যই আপনার ডাটাবেস রূপান্তর করতে হবে। প্রথমে আপনাকে অবশ্যই একটি ডাম্প সংরক্ষণ করতে হবে।

নির্দিষ্ট ডাটাবেসে সমস্ত সারণীর জন্য অক্ষর সেট এনকোডিংটি ইউটিএফ -8 এ পরিবর্তন করতে, কমান্ড লাইনে নিম্নলিখিত কমান্ডটি টাইপ করুন। ডাটাবেসের নাম দিয়ে DBNAME প্রতিস্থাপন করুন:

mysql --database=DBNAME -B -N -e "SHOW TABLES" | awk '{print "SET foreign_key_checks = 0; ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; SET foreign_key_checks = 1; "}' | mysql --database=DBNAME

ডাটাবেসের জন্য ইউটিএফ -8 এ অক্ষর সেট এনকোডিংটি পরিবর্তন করতে, mysql > প্রম্পটে নিম্নলিখিত কমান্ডটি টাইপ করুন । ডাটাবেসের নাম দিয়ে DBNAME প্রতিস্থাপন করুন:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

আপনি এখন আপনার ডাটাবেসে utf8 অক্ষর লিখতে আবার চেষ্টা করতে পারেন। আমি যখন আমার ডাটাবেসে 200000 সারি সিএসভি ফাইল আপলোড করার চেষ্টা করি তখন এই সমাধানটি আমাকে সহায়তা করে।


8

সাধারণভাবে, আপনি যখন বেমানান এনকোডিং / কোলেশন সহ কলামগুলিতে স্ট্রিং সন্নিবেশ করান তখন এটি ঘটে।

আমি যখন এই ট্রিগারটি পেয়েছিলাম তখন এটি ত্রুটিটি পেয়েছিলাম যা কোনও কারণে সার্ভারের কোলেশন লাভ করে। এবং মাইএসকিএল-এর ডিফল্ট হ'ল (কমপক্ষে উবুন্টুতে) লাতিন -১ সহ সুইডিশ কোলেশন। যদিও আমার কাছে ডাটাবেস এবং সমস্ত টেবিলগুলি ইউটিএফ -8 এ সেট করা ছিল, আমি এখনও সেট করতে পারি নি my.cnf:

/etc/mysql/my.cnf:

[mysqld]
character-set-server=utf8
default-character-set=utf8

এবং এটি অবশ্যই utf8- * দিয়ে সমস্ত ট্রিগার তালিকাবদ্ধ করবে:

select TRIGGER_SCHEMA, TRIGGER_NAME, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, DATABASE_COLLATION from information_schema.TRIGGERS

এবং এর দ্বারা তালিকাভুক্ত কিছু ভেরিয়েবলেরও utf-8- * থাকা উচিত (ল্যাটিন -1 বা অন্যান্য এনকোডিং নেই):

show variables like 'char%';

6

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

ALTER TABLE tabale_name MODIFY COLUMN column_name VARCHAR(255)  
CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

5

আমি একটি অনুরূপ ত্রুটি পেয়েছি ( Incorrect string value: '\xD0\xBE\xDO\xB2. ...' for 'content' at row 1)। আমি কলামের অক্ষর সেটটি পরিবর্তনের চেষ্টা করেছি utf8mb4এবং তার পরে ত্রুটি পরিবর্তিত হয়েছে 'Data too long for column 'content' at row 1'
দেখা গেল যে মাইএসকিএল আমাকে ভুল ত্রুটি দেখায়। আমি কলামের অক্ষর সেটটিকে আবার পরিণত করেছি এবং কলামের utf8প্রকারটি পরিবর্তিত করেছি MEDIUMTEXT। এর পরে ত্রুটিটি অদৃশ্য হয়ে গেল।
আমি আশা করি এটি কাউকে সাহায্য করবে
যাইহোক মারিয়াডিবি একই ক্ষেত্রে (আমি সেখানে একই INSERT পরীক্ষা করেছি) ত্রুটি ছাড়াই কেবল একটি পাঠ্য কেটে ফেলেছি।


মাইএসকিউএলও আমি অনেক কিছুই ক্লান্ত করেছি, বুঝতে পেরেছি যে মাইএসকিএল এই সংস্করণে 4 বাইট ইউটিএফ -8 আনকোডিং সমর্থন করে না এবং এটি কী ঘটছে তা বোঝার চেষ্টা করে মারা যাচ্ছিল। আপাতদৃষ্টিতে ধরণের পরিবর্তন করা ছিল উত্তর, একটি তাত্ক্ষণিক সমাধান।
লিজা

4

এই ত্রুটির অর্থ হল যে আপনার কাছে ভুল এনকোডিং সহ স্ট্রিং রয়েছে (উদাহরণস্বরূপ আপনি ইউএসএফ -8859-1 এনকোডেড স্ট্রিংটি ইউটিএফ -8 এনকোডেড কলামে প্রবেশ করার চেষ্টা করছেন), বা কলামটি আপনি প্রবেশ করার চেষ্টা করছেন এমন ডেটা সমর্থন করে না।

অনুশীলনে, পরবর্তী সমস্যাটি মাইএসকিউএল ইউটিএফ -8 বাস্তবায়নের ফলে ঘটে যা কেবল ইউনিকোডি অক্ষরকে সমর্থন করে যেখানে ইউটিএফ -8-তে প্রতিনিধিত্ব করার সময় 1-3 বাইট প্রয়োজন। জেডিবিসির মাধ্যমে মাইএসকিউএলে ইউটিএফ -8 ?োকানোর চেষ্টা করার সময় "ভুল স্ট্রিং মান" দেখুন ? বিস্তারিত জানার জন্য.


2

এই ভুল স্ট্রিং মানটিতে চলার সময় আমার জন্য সমাধান: স্ক্রিপ্টকেস ব্যবহার করে কলামের ত্রুটির জন্য '\ xF8' নিশ্চিত হওয়া উচিত ছিল যে আমার ডাটাবেসটি utf8 সাধারণ সিআই-র জন্য সেট আপ করা হয়েছে এবং আমার ফিল্ড কোলিশানও রয়েছে। তারপরে যখন আমি কোনও সিএসভি ফাইলের ডেটা আমদানি করি তখন আমি ইউএসই স্টুডিওতে সিএসভি লোড করি তখন এটি utf8 এবং Voila হিসাবে ফর্ম্যাট করে সংরক্ষণ করি! এটি কোনও মনোযোগের মতো কাজ করে, 29000 রেকর্ডে কোনও ত্রুটি নেই। পূর্বে আমি একটি এক্সেল তৈরি সিএসভি আমদানির চেষ্টা করছিলাম।


2

আমি উপরের সমস্ত সমাধানের চেষ্টা করেছি (যা সবগুলি বৈধ পয়েন্ট নিয়ে আসে), তবে কিছুই আমার পক্ষে কার্যকর ছিল না।

যতক্ষণ না আমি খুঁজে পেয়েছি যে সি # তে আমার মাইএসকিউএল টেবিল ফিল্ড ম্যাপিংগুলি একটি ভুল ধরণের ব্যবহার করছে: মাই এসকিএলডিবিটাইপ.ব্লোব । আমি এটিকে মাইএসএকএলডিবিটাইপ.টেক্সটে পরিবর্তন করেছি এবং এখন আমি চাই সমস্ত ইউটিএফ 8 প্রতীক লিখতে পারি!

PS আমার মাইএসকিউএল টেবিল ক্ষেত্রটি "লং টেক্সট" ধরণের। যাইহোক, আমি যখন মাইগেনারেশন সফ্টওয়্যার ব্যবহার করে ফিল্ড ম্যাপিংগুলি স্বয়ংক্রিয়ভাবে তৈরি করেছি, এটি স্বয়ংক্রিয়ভাবে ক্ষেত্রের প্রকারটি সি # তে মাইএসকিএলডিবিটাইপ.ব্লোব হিসাবে সেট করে।

মজার বিষয় হচ্ছে, আমি অনেক মাস ধরে কোনও ঝামেলা ছাড়াই ইউটিএফ 8 অক্ষরের সাথে মাইএসকিএলডিবিটাইপ.ব্লব টাইপটি ব্যবহার করে আসছি, একদিন পর্যন্ত আমি এতে কিছু নির্দিষ্ট অক্ষরের সাথে একটি স্ট্রিং লেখার চেষ্টা করেছি।

আশা করি এটি ত্রুটির কারণ অনুসন্ধান করতে লড়াই করে এমন কাউকে সহায়তা করবে।


1

আমি কলামের নামের আগে বাইনারি যুক্ত করেছি এবং চরসেট ত্রুটিটি সমাধান করেছি।

টেবিলএ মানগুলিতে সন্নিবেশ করান (বাইনারি স্ট্রিংকোলনাম 1);


1

হাই আমি এই ত্রুটিটি পেয়েছি যখন আমি গডাডি সার্ভার থেকে আমার অনলাইন ডাটাবেসগুলি ব্যবহার করি তবে আমার মনে হয় এটির 5.1 বা তার বেশি সংস্করণ রয়েছে। তবে আমি যখন আমার লোকালহোস্ট সার্ভারটি (সংস্করণ 5.7) থেকে করি তখন ঠিক হয়েছিল যে আমি লোকাল সার্ভার থেকে টেবিলটি তৈরি করেছি এবং মাইএসকিএল যোগ ব্যবহার করে অনলাইন সার্ভারে অনুলিপি করেছিলাম বলে মনে করি সমস্যাটি অক্ষরের সাথে সেট করে আছে

স্ক্রিনশট এখানে


1

এই ত্রুটিটি সমাধানের জন্য আমি আমার মাইএসকিউএল ডাটাবেসটিকে utf8mb4 এ আপগ্রেড করেছি যা এই বিশদ টিউটোরিয়াল অনুসরণ করে পুরো ইউনিকোড অক্ষরকে সমর্থন করে । আমি এটি সাবধানতার সাথে চালিয়ে যাওয়ার পরামর্শ দিচ্ছি, কারণ এখানে বেশ কয়েকটি গোটাচ রয়েছে (যেমন, নতুন এনকোডিংগুলির পরে আপনাকে ক্ষেত্রের ধরণগুলি সংশোধন করতে হবে যার ফলে সূচক কীগুলি খুব বড় হয়ে উঠতে পারে)।


1

এখানে ভাল উত্তর আছে। আমি কেবল আমার যুক্ত করছি যেহেতু আমি একই ত্রুটির মধ্যে পড়েছিলাম তবে এটি সম্পূর্ণ ভিন্ন সমস্যা হিসাবে দেখা গেছে। (সম্ভবত পৃষ্ঠতল একই, কিন্তু একটি ভিন্ন মূল কারণ।)

আমার জন্য ত্রুটিটি নিম্নলিখিত ক্ষেত্রের জন্য ঘটেছে:

@Column(nullable = false, columnDefinition = "VARCHAR(255)")
private URI consulUri;

এটি URIক্লাসের বাইনারি সিরিয়ালকরণ হিসাবে ডাটাবেসে সংরক্ষণ করা শেষ করে । এটি ইউনিট টেস্টিং (এইচ 2 ব্যবহার করে) বা সিআই / ইন্টিগ্রেশন টেস্টিং ( মারিয়াডিবি 4 জ ব্যবহার করে ) কোনও পতাকা উত্থাপন করে নি , এটি আমাদের প্রযোজনার মতো সেটআপে ফুরিয়েছে । (যদিও একবার সমস্যাটি বোঝা গিয়েছিল, মারিয়াডিবি 4 জে উদাহরণের মধ্যে এটির সঠিক মূল্যটি দেখার পক্ষে যথেষ্ট সহজ; এটি কেবল পরীক্ষাটি ফুটিয়ে তুলেনি)) সমাধানটি ছিল একটি কাস্টম টাইপ ম্যাপার তৈরি করা:

package redacted;

import javax.persistence.AttributeConverter;
import java.net.URI;
import java.net.URISyntaxException;

import static java.lang.String.format;

public class UriConverter implements AttributeConverter<URI, String> {
    @Override
    public String convertToDatabaseColumn(URI attribute) {
        return attribute.toString();
    }

    @Override
    public URI convertToEntityAttribute(String field) {
        try {
            return new URI(field);
        }
        catch (URISyntaxException e) {
            throw new RuntimeException(format("could not convert database field to URI: %s", field));
        }
    }
}

নিম্নলিখিত হিসাবে ব্যবহৃত:

@Column(nullable = false, columnDefinition = "VARCHAR(255)")
@Convert(converter = UriConverter.class)
private URI consulUri;

হাইবারনেট যতদূর জড়িত রয়েছে, মনে হচ্ছে এটির জন্য সরবরাহিত টাইপ ম্যাপারগুলি রয়েছে তবে এটির জন্য java.net.URLনয় java.net.URI(যা আমাদের এখানে প্রয়োজন needed


1

আমার ক্ষেত্রে এই সমস্যাটি মাইএসকিএল কলাম এনকোডিংটিকে 'বাইনারি'-তে পরিবর্তন করে সমাধান করা হয়েছিল (ডেটা টাইপটি স্বয়ংক্রিয়ভাবে ভারবিনারে পরিবর্তিত হবে)। সম্ভবত আমি সেই কলামটি ফিল্টার করতে বা অনুসন্ধান করতে সক্ষম হব না, তবে এর দরকার নেই।


1

আপনি যদি সংরক্ষণের আগে কিছু স্ট্রিং ফাংশন দিয়ে মানটি প্রসেস করতে চান তবে নিশ্চিত হয়ে নিন যে ফাংশনটি মাল্টিবাইট অক্ষরকে সঠিকভাবে পরিচালনা করতে পারে। স্ট্রিং ফাংশন যা এটি করতে পারে না এবং তা হ'ল, বলুন, ছাঁটাই করার চেষ্টা করা মাঝের একক একাধিক অক্ষরকে বিভক্ত করতে পারে এবং এর ফলে স্ট্রিং ত্রুটির পরিস্থিতি হতে পারে।

উদাহরণস্বরূপ পিএইচপি-তে আপনাকে অন্য থেকে স্যুইচ substrকরতে হবে mb_substr


0

আমার ক্ষেত্রে, আমি প্রথমে একটি '???' দেখা করেছি আমার ওয়েবসাইটে, তারপরে আমি মাইএসকিএল-এর চরিত্রের সেটটি যা এখন লাতিন ভাষাতে পরীক্ষা করেছি, তাই আমি এটি ইউটিএফ -8 এ পরিবর্তন করি, তারপরে আমি আমার প্রকল্পটি পুনরায় চালু করি, তখন আমি আপনার সাথে একই ত্রুটি পেয়েছি, তখন আমি দেখতে পেলাম যে আমি ডাটাবেসের অক্ষরটি পরিবর্তন করতে ভুলে গেছি এবং utf-8 এ পরিবর্তন করুন, বুম, এটি কাজ করে।


0

আমি এখানে উল্লিখিত প্রায় প্রতিটি পদক্ষেপের চেষ্টা করেছি। কারও কাজ হয়নি। মারিয়্যাডবি ডাউনলোড হয়েছে। এটা কাজ করেছে. আমি জানি এটি কোনও সমাধান নয় তবে এটি কারও সমস্যা দ্রুত সনাক্ত করতে বা অস্থায়ী সমাধান দিতে সহায়তা করতে পারে।

Server version: 10.2.10-MariaDB - MariaDB Server
Protocol version: 10
Server charset: UTF-8 Unicode (utf8)

0

আমার ক্ষেত্রে, Incorrect string value: '\xCC\x88'...সমস্যাটি ছিল যে কোনও ও-উমলাউট তার পচা অবস্থায় ছিল। এই প্রশ্নের-এবং-উত্তর আমাকে মধ্যে পার্থক্য বুঝতে সাহায্য করেছে এবং ö। পিএইচপি-তে, আমার জন্য স্থির ছিল পিএইচপি-র নরমালাইজার লাইব্রেরি ব্যবহার করা । যেমন Normalizer::normalize('o¨', Normalizer::FORM_C),।


-2

1 - আপনাকে আপনার সংযোগে ইউটিএফ 8 এনকন্ডিংয়ের যথাযথ ঘোষণা করতে হবে। http://php.net/manual/en/mysqli.set-charset.php

2 - আপনি যদি স্ক্রিপ্টটি কার্যকর করতে mysql কমান্ডো লাইন ব্যবহার করেন তবে আপনাকে পতাকাটি ব্যবহার করতে হবে, যেমন: Cmd: C:\wamp64\bin\mysql\mysql5.7.14\bin\mysql.exe -h localhost -u root -P 3306 --default-character-set=utf8 omega_empresa_parametros_336 < C:\wamp64\www\PontoEletronico\PE10002Corporacao\BancoDeDadosModelo\omega_empresa_parametros.sql

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