java.sql.SQLException: ভুল স্ট্রিংয়ের মান: '\ xF0 \ x9F \ x91 \ xBD \ xF0 \ x9F…'


107

আমার নীচের স্ট্রিংয়ের মান রয়েছে: "ওয়ালমার্ট ওবামা 👽💔"

আমি মাইএসকিউএল এবং জাভা ব্যবহার করছি।

আমি নিম্নলিখিত ব্যতিক্রম পাচ্ছি: ava java.sql.SQLException: ভুল স্ট্রিংয়ের মান: '\ xF0 \ x9F \ x91 \ xBD \ xF0 \ x9F ...'

এখানে পরিবর্তনশীলটি আমি intoোকানোর চেষ্টা করছি:

var1 varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL`

আমার জাভা কোড যা "ওয়ালমার্ট ওবামা 👽💔" সন্নিবেশ করানোর চেষ্টা করছে এটি একটি প্রস্তুত স্টেটমেন্ট। সুতরাং আমি setString()পদ্ধতিটি ব্যবহার করছি ।

দেখে মনে হচ্ছে সমস্যাটি মানগুলির এনকোডিং 👽💔 আমি এটা কিভাবে ঠিক করবো? পূর্বে আমি ডার্বি এসকিউএল এবং মানগুলি ব্যবহার করতাম - কেবলমাত্র দুটি স্কোয়ার হয়ে শেষ হয়েছিল (আমি মনে করি এটি নাল চরিত্রের উপস্থাপনা)

সমস্ত সাহায্যের প্রশংসা করা হয়!



আপনি যখন ডেটাবেস তৈরি করেন, আপনি চরিত্র সেট এবং এইভাবে কোলেশন দিতে পারেন:CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ম্যাক্স পেং

উত্তর:


145

আপনার যা আছে তা EXTRATERRESTRIAL ALIEN (U+1F47D)এবং BROKEN HEART (U+1F494)যা মৌলিক বহুভাষিক বিমানে নেই। এমনকি তাদের জাভাতে একটি চর হিসাবে উপস্থাপন করা যায় না "👽💔".length() == 4,। এগুলি অবশ্যই নালাগুলি নয় এবং আপনি যদি তাদের সমর্থন করে ফন্ট ব্যবহার না করেন তবে একটি স্কোয়ার দেখতে পাবে।

মাইএসকিউএল utf8কেবলমাত্র বেসিক বহুভাষিক বিমানটিকে সমর্থন করে এবং এর utf8mb4পরিবর্তে আপনার ব্যবহারের প্রয়োজন :

পরিপূরক চরিত্রের জন্য, utf8 অক্ষরটি মোটেও সঞ্চয় করতে পারে না, যখন utf8mb4 এর চারটি বাইট সংরক্ষণ করতে হয়। যেহেতু utf8 অক্ষরটি মোটেও সংরক্ষণ করতে পারে না, তাই আপনার ইউটিএফ 8 কলামগুলিতে কোনও পরিপূরক অক্ষর নেই এবং মাইএসকিউএলের পুরানো সংস্করণগুলি থেকে utf8 ডেটা আপগ্রেড করার সময় আপনার চরিত্র রূপান্তরকরণ বা ডেটা হারাতে হবে না।

সুতরাং এই অক্ষরগুলিকে সমর্থন করার জন্য আপনার মাইএসকিউএল 5.5+ হওয়া দরকার এবং আপনার utf8mb4সর্বত্র ব্যবহার করা দরকার । সংযোগ এনকোডিং হওয়া দরকার utf8mb4, অক্ষর সেট হওয়া দরকার utf8mb4এবং সহযোগিতা হওয়া দরকার utf8mb4। জাভা জন্য এটি এখনও ঠিক "utf-8", কিন্তু মাইএসকিউএল একটি পার্থক্য প্রয়োজন।

আপনি কোন ড্রাইভারটি ব্যবহার করছেন তা আমি জানি না তবে সংযোগ চরসেট সেট করার জন্য ড্রাইভার অগ্নিস্টিক পদ্ধতিটি হল ক্যোয়ারীটি পাঠানো:

SET NAMES 'utf8mb4'

সংযোগ তৈরি করার পরে ঠিক।

সংযোগকারী / জে এর জন্য এটি দেখুন :

14.14: আমি কীভাবে সংযোগকারী / জে দিয়ে 4-বাইট UTF8, utf8mb4 ব্যবহার করতে পারি?

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

আপনার কলাম এবং ডাটাবেসও সামঞ্জস্য করুন:

var1 varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL

আবার, আপনার মাইএসকিউএল সংস্করণটি utf8mb4 সমর্থনের জন্য তুলনামূলকভাবে আপ টু ডেট হওয়া দরকার।


আমার অন্যান্য সম্পর্কিত পোস্ট দেখুন: stackoverflow.com/questions/13748170/… । যদি আপনি এর উত্তর দিতে পারেন তবে আপনি এই প্রশ্নেরও উত্তর দিতে হবে। অন্য পোস্টে আমি কী করেছি তার আরও বিশদ রয়েছে।
কোডকিংপ্লাস প্লাস প্লাস

1
@ কোডকিংপ্লাস প্লাস আপনার ডাটাবেসের সমস্ত কিছু আপনি এতে পরিবর্তন করেছেন utf8mb4, দেখে মনে হচ্ছে আপনি এখনও ব্যবহার করছেন utf8_general_ci..
ইসাইলিজা

1
সংযোগকারী / জে সহ "সেট নাম" করবেন না: dev.mysql.com/doc/connector-j/en/… Do not issue the query set names with Connector/J, as the driver will not detect that the character set has changed, and will continue to use the character set detected during the initial connection setup.
বেকফ্লান

1
: যদি আপনি শুধু আপনার ডিবি পরিবর্তনের জগাখিচুড়ি সাথে ডিল করার পরিবর্তে বিএমপি বাইরে থেকে অক্ষর পরিত্রাণ পেতে চান, তাহলে এখানে দেখুন stackoverflow.com/questions/4035562/...
Indigenuity

2
আমার একই সমস্যা রয়েছে, উপরের পদক্ষেপগুলি অনুসরণ করেছি তবে সি-তে character প্রোগ্রামডাটা \ মাইএসকিউএল \ মাইএসকিউএল সার্ভার 5.7 \ my.ini
fattah.safa

16

সর্বোপরি, 4 টি বাইট প্রয়োজন এমন প্রতীকগুলি সংরক্ষণ করতে আপনার জন্য ফিচার-সেট আপডেট করতে হবে এবং এর জন্য কোলেশন utf8mb4:

  1. ডাটাবেস টেবিল / কলাম: alter table <some_table> convert to character set utf8mb4 collate utf8mb4_unicode_ci
  2. ডাটাবেস সার্ভার সংযোগ ( দেখুন )

# 2 এর জন্য আমার বিকাশের পরিবেশে সার্ভার শুরু করার সময় আমি কমান্ড লাইনে প্যারামিটার সেট করতে পছন্দ করি: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci


BTW, এর বেতন মনোযোগ সংযোগকারী / জে আচরণ সঙ্গে SET NAMES 'utf8mb4':

সংযোগকারী / জেতে ক্যোয়ারী সেট নামগুলি প্রকাশ করবেন না, কারণ ড্রাইভার সনাক্ত করতে পারে না যে অক্ষর সেটটি পরিবর্তিত হয়েছে, এবং প্রাথমিক সংযোগ সেটআপের সময় সনাক্ত করা অক্ষর সেটটি ব্যবহার করতে থাকবে।

এবং characterEncodingসংযোগ ইউআরএলগুলিতে প্যারামিটার নির্ধারণ করা এড়িয়ে চলুন কারণ এটি কনফিগার করা সার্ভার এনকোডিংকে ওভাররাইড করবে:

ক্লায়েন্টের পাশে স্বয়ংক্রিয়ভাবে সনাক্ত করা এনকোডিং ওভাররাইড করার জন্য, সার্ভারের সাথে সংযোগ করতে ব্যবহৃত URL- এ অক্ষরইনকোডিং সম্পত্তি ব্যবহার করুন।


15

অদ্ভুতভাবে, আমি দেখতে পেলাম যে &characterEncoding=UTF-8বাদ দেওয়া থেকে সরানো JDBC urlএকই ধরণের সমস্যাগুলির জন্য আমার জন্য কৌশলটি করেছে।

আমার বৈশিষ্ট্যের উপর ভিত্তি করে,

jdbc_url=jdbc:mysql://localhost:3306/dbName?useUnicode=true

আমি মনে করি এটি @ এসাইলিজা উপরের যা বলেছে তা সমর্থন করে, অর্থাত্ আমার মাইএসকিউএল, যা প্রকৃতপক্ষে 5.5, এটি ইউটিএফ -8 এনকোডিংয়ের নিজস্ব পছন্দসই স্বাদটি খুঁজে বের করছে।

(দ্রষ্টব্য, আমি জাভা কোডের InputStreamমতোই আমি পড়ছি যা উল্লেখ করছি UTF-8যা সম্ভবত ক্ষতি করে না) ...


হয়তো useUnicode=trueএমনকি প্রয়োজন নেই? আমার ক্ষেত্রে শুধু কাজ সেটিং করা হয় character_set_server=utf8mb4সার্ভারে বিশ্বব্যাপী (যদি RDS প্যারামিটার গ্রুপ) এবং না JDBC এর URL- এ কোন characterEncoding হচ্ছে।
জোশুয়া ডেভিস

6

আমি কীভাবে আমার সমস্যার সমাধান করেছি।

আমার ছিল

?useUnicode=true&amp;characterEncoding=UTF-8

আমার হাইবারনেট জেডিবিসি সংযোগ ইউআরএল এবং আমি স্ট্রিং ডেটাটাইপকে লম্বটেক্সটে ডেটাবেজে বদলেছি, যা আগে বার্চার ছিল।


আপনাকে যদি এই কলামটি সূচিকৃত এবং এটির তুলনামূলকভাবে ছোট প্রয়োজন না হয় তবে গ্রেট করুন, তবে আমি আমার সমস্ত কলামের জন্য এই কৌশলটি করতে পারি
শরিফ

3

লাইন যুক্ত করুন useUnicode=true&amp;characterEncoding=UTF-8আপনার jdbc url ।

আপনার ক্ষেত্রে UTF-8এনকোডিং ব্যবহার করে ডেটা প্রেরণ করা হচ্ছে না ।


আমি কীভাবে এটি যুক্ত করব? আমার সংযোগ স্ট্রিং? যদি এটি সাহায্য করে তবে আমি নেটবিন ব্যবহার করছি।
কোডকিংপ্লাস প্লাস প্লাস প্লিজ

আপনি কিভাবে সংযোগ তৈরি করছেন?
জেএইচএস

ড্রাইভারমনেজ.জেটসনেকশন ("জেডিবিসি: মাইএসকিএল: // লোকালহোস্ট: #### / [ডিবি নাম]", [ব্যবহারকারীর নাম], [পাসওয়ার্ড]);
কোডকিংপ্লাস প্লাস প্লাস প্লাস

এটি কি এটির মতো করুন - ড্রাইভারমনেজ.জেটকনেকশন ("jdbc: mysql: // লোকালহোস্ট: #### / [dbName]? ইউজনিকোড = সত্য & amp; ক্যারেক্টার এনকোডিং = ইউটিএফ -8", [ব্যবহারকারীর নাম], [পাসওয়ার্ড]);
জেএইচএস

1
স্ক্র্যাচ যে, আমি 'ভুলে গেছি?' তবে এখন আমি আসল পোস্টের মতো একই ত্রুটিতে ফিরে এসেছি ...
কোডকিংপ্লাস প্লাস প্লাস

3

আমি একই সমস্যা সম্মুখীন এবং সেটিং দ্বারা এটি মীমাংসিত কোলেশন করার utf8_general_ci প্রতিটি কলামের জন্য।


2

আমার ধারণা মাইএসকিউএল এটি বৈধ UTF8 পাঠ্য হিসাবে বিশ্বাস করে না। আমি একই কলাম সংজ্ঞা (মাইএসকিএল ক্লায়েন্ট সংযোগটিও ইউটিএফ 8 ছিল) দিয়ে একটি পরীক্ষার টেবিলে একটি সন্নিবেশ দেওয়ার চেষ্টা করেছি এবং এটি সন্নিবেশ করালেও, মাইএসকিউএল সি এল এল ক্লায়েন্টের সাথে জেডিবিসি হিসাবে আমি যে ডেটা উদ্ধার করেছি তা মানগুলি সঠিকভাবে পুনরুদ্ধার করতে পারেনি। ইউটিএফ 8 সঠিকভাবে কাজ করেছে তা নিশ্চিত হতে, আমি ওবামার জন্য "ও" এর পরিবর্তে একটি "ö" প্রবেশ করিয়েছি:

johan@maiden:~$ mysql -vvv test < insert.sql 
--------------
insert into utf8_test values(_utf8 "walmart öbama 👽💔")
--------------

Query OK, 1 row affected, 1 warning (0.12 sec)

johan@maiden:~$ file insert.sql 
insert.sql: UTF-8 Unicode text

পরীক্ষা করার জন্য ছোট জাভা অ্যাপ্লিকেশন:

package test.sql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Test
{

    public static void main(String[] args)
    {
        System.out.println("test string=" + "walmart öbama 👽💔");
        String url = "jdbc:mysql://hostname/test?useUnicode=true&characterEncoding=UTF-8";
        try
        {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            Connection c = DriverManager.getConnection(url, "username", "password");
            PreparedStatement p = c.prepareStatement("select * from utf8_test");
            p.execute();
            ResultSet rs = p.getResultSet();
            while (!rs.isLast())
            {
                rs.next();
                String retrieved = rs.getString(1);
                System.out.println("retrieved=\"" + retrieved + "\"");

            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

}

আউটপুট:

johan@appel:~/workspaces/java/javatest/bin$ java test.sql.Test
test string=walmart öbama 👽💔
retrieved="walmart öbama "

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


যাইহোক, আপনার স্ট্রিংয়ের অক্ষরগুলি ওএসএক্সে ফায়ারফক্স এবং ক্রোম উভয় ক্ষেত্রে সঠিকভাবে প্রদর্শিত হয় না। তারা আমার আইটার্ম অ্যাপ্লিকেশনটিতে সঠিকভাবে প্রদর্শিত হবে। আমি মনে করি এটি ফন্ট নির্ভর dependent
শুক্রবার

1

আমার একই ধরণের সমস্যা ছিল এবং সমস্ত চরসেটের বিরুদ্ধে সাবধানতার সাথে যাবার পরে এবং তারা ঠিক আছে বলে আমি বুঝতে পেরেছিলাম যে আমার ক্লাসে আমার যে বগড সম্পত্তি ছিল তা জয়েন কলাম (জাভ্যাক্স.প্রেশনে; হাইবারনেট) এর পরিবর্তে @ কলাম হিসাবে টিকা দেওয়া হয়েছিল এবং এটি সবকিছু ভেঙে ফেলছিল।


1

এক্সিকিউট

show VARIABLES like "%char%”;

অক্ষর-সেট-সার্ভার সন্ধান করুন যদি utf8mb4 না হয়।

এটি আপনার মাই সিএনএফ-তে সেট করুন

vim /etc/my.cnf

একটি লাইন যুক্ত করুন

character_set_server = utf8mb4

শেষ পুনরায় আরম্ভ করা mysql এ


1
character_set_serverবিকল্পটি নয়, নয়character-set-server
অরুণ এসআর

0

এই সেটিংটি ওল্ডআউটএফ 8 ব্যবহার করুন = সত্যই আমার পক্ষে কাজ করেছে। এটি কোনও ভুল স্ট্রিং ত্রুটি দেয় নি তবে এটি special জাতীয় বিশেষ অক্ষরকে একাধিক অক্ষরে রূপান্তরিত করে এবং ডাটাবেসে সংরক্ষণ করে।

এ জাতীয় পরিস্থিতি এড়াতে, আমি এই সম্পত্তিটি জেডিবিসি প্যারামিটার থেকে সরিয়েছি এবং এর পরিবর্তে আমার কলামের ডেটাটাইপকে বিএলওবিতে রূপান্তর করেছি। এটি নিখুঁতভাবে কাজ করেছে।


আপনি কি দয়া করে আপনার উত্তরে আরও ডিজিটাল যুক্ত করতে পারেন? (কোড, কমেন্টস ইত্যাদি)
aNnormaLz

-2

এছাড়াও, ডেটা টাইপ ভেরচার বা পাঠ্যের ব্লব ইনস্টল ব্যবহার করতে পারে।


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