Wenn Sie einen Zeichensatz definieren, der für eine Spalte Für oracle-Datenbank-Tabellen
Ich führe folgende Abfrage in SQL*Plus
CREATE TABLE tbl_audit_trail (
id NUMBER(11) NOT NULL,
old_value varchar2(255) NOT NULL,
new_value varchar2(255) NOT NULL,
action varchar2(20) CHARACTER SET latin1 NOT NULL,
model varchar2(255) CHARACTER SET latin1 NOT NULL,
field varchar2(64) CHARACTER SET latin1 NOT NULL,
stamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
user_id NUMBER(11) NOT NULL,
model_id varchar2(65) CHARACTER SET latin1 NOT NULL,
PRIMARY KEY (id),
KEY idx_action (action)
);
Erhalte ich folgenden Fehler:
action varchar2(20) CHARACTER SET latin1 NOT NULL,
*
ERROR at line 5:
ORA-00907: missing right parenthesis
Können Sie vorschlagen, was bin ich?
der Fehler ist mir neu ,aber was wird mein Erster Ansatz ist, zu finden, die fehlende
der Fehler wird nicht neu sein :-). Es ist nur eine standard-syntax-Fehler.
Ihr Recht ,dies ist aber keine spezifische Fehlermeldung aus, die wir finden können, die Ursache .
Könntest du vielleicht erklären, was fehlt, aus meiner heutigen Antwort @AloneInTheDark?
Haben Sie überprüft, mein bounty ist der Grund? "In dieser Frage nicht genügend Aufmerksamkeit geschenkt." Was ich möchte, ist die alternative Kommentare über diese situation.
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET'
und dann prüfen, ob dies unterstützen latin
oder nichtder Fehler wird nicht neu sein :-). Es ist nur eine standard-syntax-Fehler.
Ihr Recht ,dies ist aber keine spezifische Fehlermeldung aus, die wir finden können, die Ursache .
error is new to me
bedeutet ich habe noch nie einen Fehler, weil der character set
🙂 Auch ich weiß nicht character sets can't be defined at column level
danke für die Antwort +1 für dasKönntest du vielleicht erklären, was fehlt, aus meiner heutigen Antwort @AloneInTheDark?
Haben Sie überprüft, mein bounty ist der Grund? "In dieser Frage nicht genügend Aufmerksamkeit geschenkt." Was ich möchte, ist die alternative Kommentare über diese situation.
InformationsquelleAutor Ashwin N Bhanushali | 2012-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einfache Antwort ist, dass, im Gegensatz zu MySQL, Zeichensätze können nicht definiert werden Spalte (oder Tabelle) Ebene.
Latin1
ist keine gültige Oracle-Zeichensatz.Zeichensätze sind konsistent in der Datenbank und wird angegeben, wenn Sie die Datenbank erstellt. Sie können Ihren Charakter, indem Sie eine Abfrage
NLS_DATABASE_PARAMETERS
,Die vollständige Liste der möglichen Zeichensätze ist für 11g r2 und für 9i oder können Sie Abfrage -
V$NLS_VALID_VALUES
.Ist es möglich, die
ALTER SESSION
- Anweisung um dieNLS_LANGUAGE
oder dieNLS_TERRITORY
, aber leider kann man das nicht für den Zeichensatz. Ich glaube, das ist, weil die änderung der Sprache ändert sich, wie Oracle würden display die gespeicherten Daten in der Erwägung, dass die änderung der Zeichensatz ändern würde, wie Oracle speichert der Daten.Beim anzeigen der Daten, können Sie sich natürlich geben Sie den gewünschten Zeichensatz, in welchen client Sie verwenden.
Zeichensatz-migration ist keine triviale Aufgabe und sollte nicht leichtfertig getan.
Auf eine leichte seitliche Anmerkung, warum sind Sie versuchen, zu verwenden Latin-1? Es wäre mehr normal einrichten einer neuen Datenbank in so etwas wie UTF-8 (andernfalls bekannt als
AL32UTF8
- nicht verwendenUTF8
) oder UTF-16, damit Sie speichern können multi-byte-Daten effektiv. Auch wenn Sie es nicht brauchen, jetzt, es ist klug, um zu versuchen - keine Garantien im Leben - zukunftssichere Datenbank nicht migriert werden müssen in der Zukunft.Wenn Sie schauen, um anzugeben, unterschiedliche Zeichensätze für verschiedene Spalten in einer Datenbank dann die bessere Möglichkeit wäre, um festzustellen, ob diese Anforderung wirklich erforderlich ist, und zu versuchen, Sie zu entfernen. Wenn es definitiv notwendig ist,1, dann Ihre beste Wette sein könnte, um zu verwenden einen Zeichensatz, der eine Obermenge aller möglichen Zeichensätze. Dann, haben eine Art von check-Einschränkung, die die Grenzen der Spalte auf bestimmte hex-Werte. Ich würde nicht empfehlen dies an alle, die Potenzial für Fehler, die sich einschleichen, ist Massiv und es ist extrem Komplex. Außerdem werden verschiedene Zeichensätze Darstellung unterschiedlicher hex-Werte anders. Dies wiederum bedeutet, dass Sie brauchen, um zu erzwingen, dass eine Spalte gerendert wird, in einem spezifischen Charakter, was unmöglich ist, da es außerhalb des Bereichs der Datenbank.
1. Ich wäre daran interessiert zu wissen, die situation
CREATE TABLE utf_test ( coll VARCHAR(50) NOT NULL CHARACTER SET utf8 );
werfen die gleichen FehlerORA-00907: missing right parenthesis
was soll ich tun, sir?ändern der Datentyp
nchar
mein problem gelöst.Bitte nicht mit einem NCHAR-es sei denn, Sie sind extrem sicher, was Sie tun @masT. Verwenden Sie eine NVARCHAR2...
InformationsquelleAutor Ben
Gemäß zur Verfügung DDL-Anweisung, es ist eine Notwendigkeit für die Verwendung von 2-Zeichensätze. Die Umsetzung dieser Funktionalität in Oracle unterscheidet sich von MySQL und fertig mit n* Datentypen wie nvarchar2, nchar... Latin1 ist ähnlich wie einige westeuropäische Zeichensatz das könnte Standard sein. So dass Sie in der Lage zu definieren, zum Beispiel "Latin1" (WIR**) und einige Unicode (UTF8,..).
Den Datentyp NVARCHAR2 wurde von Oracle-Datenbanken, die wollen, um die Verwendung von Unicode für einige Spalten, während ein anderer Zeichensatz für den rest der Datenbank (die verwendet VARCHAR2). Die NVARCHAR2 ist nur-Unicode-Datentyp.
Der Grund, den Sie verwenden möchten, NVARCHAR2 könnte sein, dass dein DB verwendet eine nicht-Unicode-Zeichen und Sie wollen immer noch in der Lage, zum speichern von Unicode-Daten für einige Spalten.
Spalten in deinem Beispiel wäre in der Lage, zum speichern der gleichen Daten, jedoch ist die byte-Speicher wird anders sein.
InformationsquelleAutor