डेटाबेस में सभी तालिकाओं को एक कोलाजेशन में कैसे बदलें?


82

मुझे त्रुटि मिल रही है:

ऑपरेशन के लिए कोलाज (utf8_general_ci, IMPLICIT) और (utf8_unicode_ci, IMPLICIT) का अवैध मिश्रण '' ''

मैंने दोनों तालिकाओं को मैन्युअल रूप से बदलने की कोशिश की, utf8_general_ci,IMPLICITलेकिन मुझे अभी भी त्रुटि मिल रही है।

क्या सभी तालिकाओं को बदलने utf8_general_ci,IMPLICITऔर इसके साथ किए जाने का कोई तरीका है?


यह मिला (कुछ अच्छे उत्तर थे): stackoverflow.com/questions/105572/…
ल्यूक व्याट

जवाबों:


166

आपको प्रत्येक तालिका के लिए एक परिवर्तन तालिका विवरण निष्पादित करना होगा। कथन इस रूप का अनुसरण करेगा:

ALTER TABLE tbl_name
[[DEFAULT] CHARACTER SET charset_name]
[COLLATE collation_name]

अब डेटाबेस में सभी तालिकाओं को प्राप्त करने के लिए आपको निम्नलिखित क्वेरी को निष्पादित करना होगा:

SELECT * 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="YourDataBaseName"
AND TABLE_TYPE="BASE TABLE";

तो अब MySQL को आपके लिए कोड लिखना चाहिए:

SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," COLLATE your_collation_name_here;") AS    ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="YourDatabaseName"
AND TABLE_TYPE="BASE TABLE";

आप परिणामों की प्रतिलिपि बना सकते हैं और उन्हें निष्पादित कर सकते हैं। मैंने सिंटैक्स का परीक्षण नहीं किया है, लेकिन आपको बाकी का पता लगाने में सक्षम होना चाहिए। इसे थोड़ा व्यायाम समझें।

उम्मीद है की वो मदद करदे!


7
किसी के लिए एक त्वरित सही समाधान की तलाश में, मैंने निम्नलिखित नामों का उपयोग तालिका के नाम के साथ संभव खोजशब्दों और अर्धविरामों का उपयोग करके किया है :) CONCAT("ALTER TABLE `", TABLE_NAME,"` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;")
ब्रायन लीशमैन

3
मैंने इस क्वेरी को इस तरह से लपेटा SELECT GROUP_CONCAT(ExecuteTheString SEPARATOR ' ') FROM (....) tकि मैं phpMyAdmin में एक बार में सभी तालिकाओं को आसानी से पकड़ सकूं।
ज़ेन

यह MySQL PHPMYAdmin
माइकल

@ मिचेल अभी भी मेरे लिए काम करता है। क्या आपने अपनी स्थिति को प्रतिबिंबित करने के लिए मापदंडों को बदल दिया?
नामीबिया

@ नेम्फिबियन नोप I केवल स्कीमा को मेरे स्वयं के स्कीमा और टेबल प्रकार (InnoDB) से बदल देता है
माइकल

63

तालिका के अंदर भी varchar कॉलम के टकराने के लिए बेहतर विकल्प

SELECT CONCAT('ALTER TABLE `', TABLE_NAME,'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') AS    mySQL
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA= "myschema"
AND TABLE_TYPE="BASE TABLE"

जोड़ स्क्रिप्ट का उपयोग शुरू करने से पहले यदि आपके पास नॉन यूटीएफ 8 कॉलम पर फोरिन की के साथ डेटा है

SET foreign_key_checks = 0;

इसका मतलब है कि वैश्विक एसक्यूएल mySQL के लिए होगा:

SET foreign_key_checks = 0;
ALTER TABLE `table1` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `table2` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `tableXXX` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
SET foreign_key_checks = 1;

लेकिन अगर mysql प्रलेखन http://dev.mysql.com/doc/refman/5.1/en/charset-column.html , के अनुसार देखभाल करें

यदि आप स्तंभ को एक वर्ण से दूसरे वर्ण में परिवर्तित करने के लिए उपयोग करते हैं, तो MySQL डेटा मानों को मैप करने का प्रयास करता है, लेकिन यदि वर्ण सेट असंगत हैं, तो डेटा हानि हो सकती है। "

संपादित करें: विशेष रूप से कॉलम प्रकार एनम के साथ, यह बस पूरी तरह से एनम सेट सेट करता है (भले ही कोई विशेष कैक्टर्स न हो) https://bugs.mysql.com/bug.php?id=26731


27

@ नामीफिअन के सुझाव से मुझे बहुत मदद मिली ...
हालांकि थोड़ा आगे बढ़े और स्क्रिप्ट में कॉलम और विचार जोड़े

बस अपने स्कीमा का नाम नीचे दर्ज करें और यह बाकी काम करेगा

-- set your table name here
SET @MY_SCHEMA = "";

-- tables
SELECT DISTINCT
    CONCAT("ALTER TABLE ", TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as queries
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA=@MY_SCHEMA
  AND TABLE_TYPE="BASE TABLE"

UNION

-- table columns
SELECT DISTINCT
    CONCAT("ALTER TABLE ", C.TABLE_NAME, " CHANGE ", C.COLUMN_NAME, " ", C.COLUMN_NAME, " ", C.COLUMN_TYPE, " CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as queries
FROM INFORMATION_SCHEMA.COLUMNS as C
    LEFT JOIN INFORMATION_SCHEMA.TABLES as T
        ON C.TABLE_NAME = T.TABLE_NAME
WHERE C.COLLATION_NAME is not null
    AND C.TABLE_SCHEMA=@MY_SCHEMA
    AND T.TABLE_TYPE="BASE TABLE"

UNION

-- views
SELECT DISTINCT
    CONCAT("CREATE OR REPLACE VIEW ", V.TABLE_NAME, " AS ", V.VIEW_DEFINITION, ";") as queries
FROM INFORMATION_SCHEMA.VIEWS as V
    LEFT JOIN INFORMATION_SCHEMA.TABLES as T
        ON V.TABLE_NAME = T.TABLE_NAME
WHERE V.TABLE_SCHEMA=@MY_SCHEMA
    AND T.TABLE_TYPE="VIEW";

3
मैंने आपके कोड को सफलता के लिए उपयोग किया, धन्यवाद। मैं विदेशी कुंजी जांच सक्षम / अक्षम करने की सलाह दूंगा और तालिका कुंजियों के आसपास उद्धरण भी जोड़ूंगा।
इगोर स्कोरिक

1
स्तंभों को व्यक्तिगत रूप से करने के लिए आवश्यक नहीं है क्योंकि ALTER TABLE CONVERT TO CHARACTER SETस्वचालित रूप से सभी स्तंभों को कनवर्ट करता है
SystemParadox

बहुत अच्छा काम करता है। मेरे मामले में मुझे सफलता के लिए खोजशब्द संघर्षों (जैसे Desc, Password..) से बचने के लिए तालिका / स्तंभ नामों को उद्धृत करना पड़ा ।
दीरचो

19

नीचे अधिक सटीक क्वेरी है। मैं उदाहरण दे रहा हूं कि इसे utf8 में कैसे परिवर्तित किया जाए

SELECT CONCAT("ALTER TABLE `", TABLE_NAME,"` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;") AS    mySQL
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="myschema"
AND TABLE_TYPE="BASE TABLE"

अच्छा है, लेकिन मुझे इसे CONVERT TO CHARACTER SETडेटा के साथ तालिकाओं के लिए बदलने की आवश्यकता है
user11153

8

आप इस BASH स्क्रिप्ट का उपयोग कर सकते हैं:

#!/bin/bash

USER="YOUR_DATABASE_USER"
PASSWORD="YOUR_USER_PASSWORD"
DB_NAME="DATABASE_NAME"
CHARACTER_SET="utf8" # your default character set
COLLATE="utf8_general_ci" # your default collation

tables=`mysql -u $USER -p$PASSWORD -e "SELECT tbl.TABLE_NAME FROM information_schema.TABLES tbl WHERE tbl.TABLE_SCHEMA = '$DB_NAME' AND tbl.TABLE_TYPE='BASE TABLE'"`

for tableName in $tables; do
    if [[ "$tableName" != "TABLE_NAME" ]] ; then
        mysql -u $USER -p$PASSWORD -e "ALTER TABLE $DB_NAME.$tableName DEFAULT CHARACTER SET $CHARACTER_SET COLLATE $COLLATE;"
        echo "$tableName - done"
    fi
done

7

यदि आप PhpMyAdmin का उपयोग कर रहे हैं, तो आप अब कर सकते हैं:

  1. डेटाबेस का चयन करें।
  2. "ऑपरेशन" टैब पर क्लिक करें।
  3. "Collation" अनुभाग के तहत, वांछित कोलाज चुनें।
  4. "सभी टेबल कोलाज बदलें" चेकबॉक्स पर क्लिक करें।
  5. एक नया "सभी टेबल कॉलम कोलाज बदलें" चेकबॉक्स दिखाई देगा।
  6. "सभी टेबल कॉलम कोलाज बदलें" चेकबॉक्स पर क्लिक करें।
  7. "गो" बटन पर क्लिक करें।

मेरे पास बदलने के लिए 250 से अधिक टेबल थे। इसमें 5 मिनट का समय लगा।


4

PhpMyAdmin के लिए मैंने यह पता लगाया:

SELECT GROUP_CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" SEPARATOR ' ') AS    OneSQLString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="yourtableschemaname"
AND TABLE_TYPE="BASE TABLE"

बस अपना नाम बदलें और आप ठीक हैं।


@LucaC। आपको group_concat की सीमा को बढ़ाने की आवश्यकता है:set session group_concat_max_len = @@max_allowed_packet;
James

3

यह एक बैश स्क्रिप्ट का मेरा संस्करण है। यह डेटाबेस के नाम को एक पैरामीटर के रूप में लेता है और सभी तालिकाओं को दूसरे चार्टसेट और कॉलेशन (किसी अन्य पैरामीटर द्वारा दिए गए या स्क्रिप्ट में निर्धारित डिफ़ॉल्ट मान) में परिवर्तित करता है।

#!/bin/bash

# mycollate.sh <database> [<charset> <collation>]
# changes MySQL/MariaDB charset and collation for one database - all tables and
# all columns in all tables

DB="$1"
CHARSET="$2"
COLL="$3"

[ -n "$DB" ] || exit 1
[ -n "$CHARSET" ] || CHARSET="utf8mb4"
[ -n "$COLL" ] || COLL="utf8mb4_general_ci"

echo $DB
echo "ALTER DATABASE $DB CHARACTER SET $CHARSET COLLATE $COLL;" | mysql

echo "USE $DB; SHOW TABLES;" | mysql -s | (
    while read TABLE; do
        echo $DB.$TABLE
        echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;" | mysql $DB
    done
)

3

पासवर्ड चर जोड़कर @Petr Stastny से एक कदम आगे बढ़कर उत्तर लेना। मैं पसंद करूंगा अगर यह वास्तव में एक तर्क के रूप में एक नियमित पासवर्ड की तरह लेता है, लेकिन यह मेरी जरूरत के लिए काम कर रहा है।

#!/bin/bash

# mycollate.sh <database> <password> [<charset> <collation>]
# changes MySQL/MariaDB charset and collation for one database - all tables and
# all columns in all tables

DB="$1"
PW="$2"
CHARSET="$3"
COLL="$4"

[ -n "$DB" ] || exit 1
[ -n "$PW" ]
[ -n "$CHARSET" ] || CHARSET="utf8mb4"
[ -n "$COLL" ] || COLL="utf8mb4_bin"

PW="--password=""$PW"

echo $DB
echo "ALTER DATABASE $DB CHARACTER SET $CHARSET COLLATE $COLL;" | mysql -u root "$PW"

echo "USE $DB; SHOW TABLES;" | mysql -s "$PW" | (
    while read TABLE; do
        echo $DB.$TABLE
        echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;" | mysql "$PW" $DB
    done
)

PW="pleaseEmptyMeNow"

1

यदि आप कॉपी-पेस्ट बैश स्क्रिप्ट चाहते हैं:

var=$(mysql -e 'SELECT CONCAT("ALTER TABLE ", TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_czech_ci;") AS execTabs FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="zabbix" AND TABLE_TYPE="BASE TABLE"' -uroot -p )

var+='ALTER DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_general_ci;'

echo $var | cut -d " " -f2- | mysql -uroot -p zabbix

Zabbix को अपने डेटाबेस के नाम में बदलें।


1

GH से आगे बढ़ने के बाद, मैंने उपयोगकर्ता और होस्ट पैरामीटर को जोड़ा है जो आपको दूरस्थ सर्वर पर ऐसा करने की आवश्यकता है

    #!/bin/bash

    # mycollate.sh <database> <user> <password> [<host> <charset> <collation>]
    # changes MySQL/MariaDB charset and collation for one database - all tables and
    # all columns in all tables

    DB="$1"
    USER="$2"
    PW="$3"
    HOST="$4"
    CHARSET="$5"
    COLL="$6"

    [ -n "$DB" ] || exit 1
    [ -n "$USER" ] || exit 1
    [ -n "$PW" ] || exit 1
    [ -n "$HOST" ] || HOST="localhost"
    [ -n "$CHARSET" ] || CHARSET="utf8mb4"
    [ -n "$COLL" ] || COLL="utf8mb4_general_ci"

    PW="--password=""$PW"
    HOST="--host=""$HOST"
    USER="--user=""$USER"

    echo $DB
    echo "ALTER DATABASE $DB CHARACTER SET $CHARSET COLLATE $COLL;" | mysql "$HOST" "$USER" "$PW"

    echo "USE $DB; SHOW TABLES;" | mysql  "$HOST" "$USER" "$PW" | (
        while read TABLE; do
            echo $DB.$TABLE
            echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;" | mysql  "$HOST" "$USER" "$PW" $DB
        done
    )

    PW="pleaseEmptyMeNow"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.